createmutex原型_c语言mutex_createmutex(2)

电脑杂谈  发布时间:2017-02-17 02:01:51  来源:网络整理

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

区

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

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

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

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

functionTryEnterCriticalSection(varlpCriticalSection:TRTLCriticalSection):BOOL;stdcall;

TryEnterCriticalSection()不同于EnterCriticalSection()的声明在于多出一个布尔型的返回

值,如果返回True代表成功进入临界区,如果返回False代表临界区已占用且不进入临界

区。运用这个函数,线程能够迅速查看它是否可以访问某个共享资源,如果不能访问,那么

它可以继续执行某些其他操作,而不必进行等待。

使用TryEnterCriticalSection(),必须判断其返回值。

当你不需要临界区时,应当调用DeleteCriticalSection()过程删除临界区,该函数多半在窗

体销毁时或程序终止前执行。下面是它的声明:

procedureDeleteCriticalSection(varlpCriticalSection:TRTLCriticalSection);stdcall;

例:

type

TMyThread=class(TThread)

protected

procedureExecute;override;

public

constructorCreate;virtual;

end;

var

Form1:TForm1;

CriticalSection:TRTLCriticalSection;//定义临界区

implementation

{$R*.dfm}

var

tick:Integer=1;

procedureTMyThread.Execute;

begin

EnterCriticalSection(CriticalSection);//进入临界区

try

Form1.Edit1.Text:=IntToStr(tick);

Inc(tick);

Sleep(10);

finally

LeaveCriticalSection(CriticalSection);//离开临界区

end;

end;

constructorTMyThread.Create;

begin

inheritedCreate(False);

FreeOnTerminate:=True;

end;

procedureTForm1.RzButton1Click(Sender:TObject);

var

index:Integer;

begin

forindex:=0to15do

TMyThread.Create;

end;

procedureTForm1.FormCreate(Sender:TObject);

begin

InitializeCriticalSection(CriticalSection);//初始化临界区

end;

procedureTForm1.FormDestroy(Sender:TObject);


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32871-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 汉献帝
      汉献帝

      这些人怎么不先反思反思自己

    热点图片
    拼命载入中...