您的位置:首页 > 编程语言 > C语言/C++

C++多线程之使用Mutex和Critical_Section

2016-10-11 10:46 288 查看
CRITICAL_SECTION只能用于不同线程的互斥,而不能用于同步。因为同一个线程可以多次EnterCriticalSection。。   为什么网上的代码,很多“锁”、“自动锁”的类,都是用CRITICAL_SECTION实现。   如果使用的人不熟悉这个,很容易就会用错呀。

C++多线程之使用Mutex和Critical_Section

Mutex和Critical Section都是主要用于限制多线程(Multithread)对全局或共享的变量、对象或内存空间的访问。下面是其主要的异同点(不同的地方用绿色表示)。

 

Mutex

Critical Section       #include <windows.h>

性能和速度

慢。

Mutex 是内核对象,相关函数的执行 (WaitForSingleObject,

ReleaseMutex)需要用户模式(User Mode)到内核模式

(Kernel Mode)的转换,在x86处理器上这种转化一般要

发费600个左右的 CPU指令周期。

快。

Critical Section本身不是内核对象,相关函数

(EnterCriticalSection,LeaveCriticalSection)

的调用一般都在用户模式内执行,在x86处理器上

一般只需要发费9个左右的 CPU指令周期。只有

当想要获得的锁正好被别的线程拥有时才会退化

成和Mutex一样,即转换到内核模式,发费600个

左右的 CPU指令周期。

能否跨越进程(Process)边界

可以

不可

定义写法

HANDLE hmtx;

CRITICAL_SECTION cs;

初始化写法

hmtx= CreateMutex (NULL, FALSE, NULL);

InitializeCriticalSection(&cs);

结束清除写法

CloseHandle(hmtx);

DeleteCriticalSection(&cs);

无限期等待的写法

WaitForSingleObject (hmtx, INFINITE);

EnterCriticalSection(&cs);

0等待(状态检测)的写法

WaitForSingleObject (hmtx, 0);

TryEnterCriticalSection(&cs);

任意时间等待的写法

WaitForSingleObject (hmtx, dwMilliseconds);

不支持

锁释放的写法

ReleaseMutex(hmtx);

LeaveCriticalSection(&cs);

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息