Delphi 线程安全的三种方法(转)
2010-01-21 12:21
多核时代的到来,对于我们程序员来说要尽快的,尽可能多的使用多线程编程只有这
样,作的程序才会有高效率,这个思想一定要宣传啊,不然多核时代了,还写单线程的程
序就太不够档次了。
delphi 中多线程同步的一些方法
当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源。例如,假设有
一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件中的字符数。
当然,在把整个文件调入内存之前,统计它的计数是没有意义的。但是,由于每个操作都
有自己的线程,操作系统会把两个线程当作是互不相干的任务分别执行,这样就可能在没
有把整个文件装入内存时统计字数。为解决此问题,你必须使两个线程同步工作。
存在一些线程同步地址的问题,Win32 提供了许多线程同步的方式。在本节你将看到使用
临界区、 互斥、信号量和事件来解决线程同步的问题。
1. 临界区
临界区是一种最直接的线程同步方式。所谓临界区,就是一次只能由一个线程来执行的一
段代码。如果把初始化数组的代码放在临界区内,另一个线程在第一个线程处理完之前是
不会被执行的。
在使用临界区之前,必须使用 InitializeCriticalSection()过程来初始化它。
其声明如下:
procedure InitializeCriticalSection(var
lpCriticalSection 参 数 是 一 个 TRTLCriticalSection 类 型 的 记 录 , 并 且 是 变 参 。 至 于
TRTLCriticalSection 是如何定义的,这并不重要,因为很少需要查看这个记录中的具体内
容。只需要在 lpCriticalSection 中传递未初始化的记录,InitializeCriticalSection()过程就会填
充这个记录。
注意 Microsoft 故意隐瞒了 TRTLCriticalSection 的细节。因为,其内容在不同的硬件平台上
是不同的。在基于 Intel 的平台上,TRTLCriticalSection 包含一个计数器、一个指示当前线
程句柄的域和一个系统事件的句柄。在 Alpha 平台上,计数器被替换为一种 Alpha-CPU 数
据结构,称为 spinlock。在记录被填充后,我们就可以开始创建临界区了。这时我们需要
用 EnterCriticalSection()和 LeaveCriticalSection()来封装代码块。这两个过程的声明如下:
procedure EnterCriticalSection(var lpCriticalSection:TRRLCriticalSection);stdcall;
procedure LeaveCriticalSection(var
正如你所想的,参数 lpCriticalSection 就是由 InitializeCriticalSection()填充的记录。
当你不需要 TRTLCriticalSection 记录时,应当调用 DeleteCriticalSection()过程,下面是它的
声明:
procedure DeleteCriticalSection(var
2. 互斥
互斥非常类似于临界区,除了两个关键的区别:首先,互斥可用于跨进程的线程同步。其
次,互斥能被赋予一个字符串名字,并且通过引用此名字创建现有互斥对象的附加句柄。
评论1