关于多线程程序中锁定内存的一些介绍
2004-12-21 15:59
411 查看
避免同时访问
为了避免与其他线程在访问一个全局对象货变量时发生冲突,需要在执行线程代码时锁定其他线程的执行,直至完成操作。VCL支持三种技术来达到这个目的:
(1) 锁定对象:有些对象自己有锁定的功能,如canvas
(2) 使用critical区
如果对象没有提高内置的锁定功能,需要使用critical区,Critical区在同一个时间只也许一个线程进入。为了使用Critical区,产生一个TCriticalSection全局的实例。TcriticalSection有两个方法,Acquire(阻止其他线程执行该区域)和Release(取消阻止)
每个Critical区是与你想要保护的全局内存相关联。每个访问全局内存的线程必须首先使用Acquire来保证没有其他线程使用它。完成以后,线程调用Release方法,让其他线程也可以通过调用Acquire来使用这块全局内存。
警告:Critical区只有在所有的线程都使用它来访问全局内存,如果有线程直接调用内存,而不通过Acquire,会造成同时访问的问题。例如:LockXY是一个全局的Critical区变量。任何一个访问全局X, Y的变量的线程,在访问前,都必须使用Acquire
LockXY.Acquire; { lock out other threads }
try
Y := sin(X);
finally
LockXY.Release;
end;
(3) 使用multi-read exclusive-write synchronizer
当你使用critical区保护全局内存时,同一个时间内只允许一个线程使用这块内存。这也许会超过你的要求,特别是对于那些经常读而很少写的对象或变量。在多线程内,当没有线程对同样的内存进行写操作时,同时读它是没有任何问题。当你有一些全局变量需要经常读而很少写时,可以使用TmultiReadExclusiveWriteSynchronizer保护它们。这个对象象Critical section, 但是当内存没有线程在写它时,允许多个线程读取一个内存。
为了使用multi-read exclusive-write synchronizer,产生一个全局的 TmultiReadExclusiveWriteSynchronizer实例,与你想要保护的内存相关联。每个线程如果项读取该内存,必须先调用BeginRead方法。它确信没有其他的线程在写内存。读完后,调用EndRead。写内存时,调用BeginWrite,写完后,调用 EndWrite。
警告:同Critical section一样,multi-read exclusive-write synchronizer也只有在所有的线程都使用它访问同一块全局内存时才有效。直接访问该内存将会导致同时访问问题。
摘自:http://www.yesky.com/20000319/35322.shtml
为了避免与其他线程在访问一个全局对象货变量时发生冲突,需要在执行线程代码时锁定其他线程的执行,直至完成操作。VCL支持三种技术来达到这个目的:
(1) 锁定对象:有些对象自己有锁定的功能,如canvas
(2) 使用critical区
如果对象没有提高内置的锁定功能,需要使用critical区,Critical区在同一个时间只也许一个线程进入。为了使用Critical区,产生一个TCriticalSection全局的实例。TcriticalSection有两个方法,Acquire(阻止其他线程执行该区域)和Release(取消阻止)
每个Critical区是与你想要保护的全局内存相关联。每个访问全局内存的线程必须首先使用Acquire来保证没有其他线程使用它。完成以后,线程调用Release方法,让其他线程也可以通过调用Acquire来使用这块全局内存。
警告:Critical区只有在所有的线程都使用它来访问全局内存,如果有线程直接调用内存,而不通过Acquire,会造成同时访问的问题。例如:LockXY是一个全局的Critical区变量。任何一个访问全局X, Y的变量的线程,在访问前,都必须使用Acquire
LockXY.Acquire; { lock out other threads }
try
Y := sin(X);
finally
LockXY.Release;
end;
(3) 使用multi-read exclusive-write synchronizer
当你使用critical区保护全局内存时,同一个时间内只允许一个线程使用这块内存。这也许会超过你的要求,特别是对于那些经常读而很少写的对象或变量。在多线程内,当没有线程对同样的内存进行写操作时,同时读它是没有任何问题。当你有一些全局变量需要经常读而很少写时,可以使用TmultiReadExclusiveWriteSynchronizer保护它们。这个对象象Critical section, 但是当内存没有线程在写它时,允许多个线程读取一个内存。
为了使用multi-read exclusive-write synchronizer,产生一个全局的 TmultiReadExclusiveWriteSynchronizer实例,与你想要保护的内存相关联。每个线程如果项读取该内存,必须先调用BeginRead方法。它确信没有其他的线程在写内存。读完后,调用EndRead。写内存时,调用BeginWrite,写完后,调用 EndWrite。
警告:同Critical section一样,multi-read exclusive-write synchronizer也只有在所有的线程都使用它访问同一块全局内存时才有效。直接访问该内存将会导致同时访问问题。
摘自:http://www.yesky.com/20000319/35322.shtml
相关文章推荐
- 关于多线程的使用一些基本介绍
- 关于C程序运行时的内存 的一些理解
- 链接,转载与库:关于程序装载入内存的一些小实验
- 关于 内存对齐 && sizeof 的介绍 2 —— 结构体(改)
- 关于多线程遇到的一些问题
- 注册表项关于start参数的说明,一直以来都搞错了,竟然还写了个错误的程序禁用本级的一些自启动项,汗呀
- 关于程序性能优化基础的一些个人总结
- 关于android5.0一些主题颜色的介绍
- 关于ShapeDrawable应用的一些介绍(下)
- 关于程序内存的深度理解
- 关于编译的一些事儿:加速Linux程序编译(转)
- STM32的DMA的配置使用(关于原理。在《计算机组成与系统结构》的输入输出系统中有一些DMA的原理介绍)
- 关于微信小程序开发的一些细节
- 关于VESA的一些简单介绍
- 关于VS2017中编写程序的一些问题
- 关于在VS2008以下版本的MFC程序使用VS 2008 FeaturePack出现内存泄露的理解
- 关于VB使用ActiveX.Exe创建多线程程序的奇怪问题
- 一些关于AODV介绍的好的网址
- Java语言深入:关于多线程程序模型研究
- 关于单片机程序运行的一些理解