c语言中进入临界区函数,createmutex原型_c语言mutex_createmutex(13)

下面的同步技术一般均有两种使用方式,一种是直接使用WindowsAPI函数,一种是使用

由Delphi对API函数进行封装的类。

以下函数以Delphi2009中的函数格式为准。

1.CriticalSections临界区

临界区是一种最直接的线程同步方式。所谓临界区,就是一次只能由一个线程来执行的一段

代码。例如把初始化数组的代码放在临界区内,另一个线程在第一个线程处理完之前是不会

被执行的。临界区非常适合于序列化对一个进程中的数据的访问,因为它们的速度很快。

(1).使用EnterCriticalSection()和LeaveCriticalSection()API函数

在使用临界区之前,必须定义一个TRTLCriticalSection类型的记录变量并使用

InitializeCriticalSection()过程来初始化临界区。该过程多半在窗体创建时或在程序初始化时

执行。

其声明如下:

procedureInitializeCriticalSection(varlpCriticalSection:TRTLCriticalSection);stdcall;

lpCriticalSection参数是一个TRTLCriticalSection类型的记录,并且是变参。至于

TRTLCriticalSection是如何定义的,这并不重要,因为很少需要查看这个记录中的具体内容。

只需要在lpCriticalSection中传递未初始化的记录,InitializeCriticalSection()过程就会填

充这个记录。

注意:Microsoft故意隐瞒了TRTLCriticalSection的细节。因为,其内容在不同的硬件平台

2

上是不同的。在基于Intel的平台上,TRTLCriticalSection包含一个计数器、一个指示当前

线程句柄的域和一个系统事件的句柄。在Alpha平台上,计数器被替换为一种Alpha-CPU数据结构,称为spinlock。

在记录被填充后,我们就可以开始创建临界区了。这时我们需要用EnterCriticalSection()和

LeaveCriticalSection()来封装代码块,这两个函数分别代表进入和离开临界区,将要同步的

代码块放在这两个函数中间。在第一个线程调用了EnterCriticalSection()之后,所有别的

线程就不能再进入代码块并挂起等待第一个线程离开临界区。下一个线程要等第一个线程调

用LeaveCriticalSection()后才能被唤醒。这两个过程的声明如下:

procedureEnterCriticalSection(varlpCriticalSection:TRTLCriticalSection);stdcall;//进入临界区

procedureLeaveCriticalSection(varlpCriticalSection:TRTLCriticalSection);stdcall;//离开临界

正如你所想的,参数lpCriticalSection就是由InitializeCriticalSection()填充的记录。

如果在某个子线程执行EnterCriticalSection()前,已经有另一个线程进入临界区且还未离

开临界区,则该子线程将挂起并无限期等待另一个线程离开临界区,要想不挂起且0时间

等待,必须使用TryEnterCriticalSection()。该过程声明如下:

functionTryEnterCriticalSection(varlpCriticalSection:TRTLCriticalSection):BOOL;stdcall;

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-32871-13.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值