createmutex原型_c语言mutex_createmutex(15)

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

TcriticalSection.Enter等效于EnterCriticalSection()。

4

TcriticalSection.TryEnter等效于TryEnterCriticalSection()。

TcriticalSection.Leave等效于LeaveCriticalSection()。

例:

//在主线程中定义

varcriticalsection:TCriticalsection;

criticalsection:=TCriticalsection.Create;

…

//在子线程中使用

criticalsection.Enter;

try

...

finally

criticalsection.Leave;

end;

警告:临界区只有在所有的线程都使用它来访问全局内存时才起作用,如果有线程直接调用

内存,而不通过临界区,也会造成同时访问的问题。

注意:临界区主要是为实现线程之间同步的,但是使用的时候要注意,一定要在使用临界区

同步的线程之外建立该临界区(一般在主线程中定义临界区并初始化临界区)。临界区是一

个进程里的所有线程同步的最好办法,它不是系统级的,只是进程级的,也就是说它可能利

用进程内的一些标志来保证该进程内的线程同步,据Richter说是一个记数循环。临界区只

能在同一进程内使用。

2.Mutex互斥

互斥是在序列化访问资源时使用操作系统内核对象的一种方式。我们首先设置一个互斥对

象,然后访问资源,最后释放互斥对象。在设置互斥时,如果另一个线程(或进程)试图设

置相同的互斥对象,该线程将会停下来,直到前一个线程(或进程)释放该互斥对象为止。

注意它可以由不同应用程序共享。互斥的效果非常类似于临界区,除了两个关键的区别:首

先,互斥可用于跨进程的线程同步。其次,互斥对象能被赋予一个字符串名字,并且通过引

用此名字创建现有内核对象的附加句柄。线程同步使用临界区,进程同步使用互斥。

当一个互斥对象不再被一个线程所拥有,它就处于发信号状态。此时首先调用

WaitForSingleObject()函数(实现WaitFor功能的API还有几个,这是最简单的一个)的线

程就成为该互斥对象的拥有者,将互斥对象设为不发信号状态。当线程调用ReleaseMutex()

函数并传递一个互斥对象的句柄作为参数时,这种拥有关系就被解除,互斥对象重新进入发

信号状态。

提示:临界区和互斥的作用类似,都是用来进行同步的,但它们间有以下一点差别。临界区

只能在进程内使用,也就是说只能是进程内的线程间的同步;而互斥则还可用在进程之间的;

临界区随着进程的终止而终止,而互斥,如果你不用CloseHandle()的话,在进程终止后

仍然在系统内存在,也就是说它是操作系统全局内核对象;临界区与互斥最大的区别是在性

能上,临界区在没有线程冲突时,要用10~15个时间片,而互斥由于涉及到系统内核要用

5

400~600个时间片;临界区不是内核对象,它不由操作系统的低级部件管理,而且不能使

用句柄来操纵,而互斥属于操作系统内核对象。

(1).使用CreateMutex()API函数

调用函数CreateMutex()来创建一个互斥。下面是函数的声明:

functionCreateMutex(lpMutexAttributes:PSecurityAttributes;bInitialOwner:BOOL;lpName:

PWideChar):THandle;stdcall;

lpMutexAttributes参数为一个指向TsecurityAttributtes记录的指针。此参数通常设为nil,


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

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

    • 光良
      光良

      舰载武器质量和威力也很重要

    • 增田由
      增田由

      首先是判明其意图和性质

    • 鲁献公姬具
      鲁献公姬具

      你马云的说法很好

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