C++多线程之使用Mutex和Critical_Section
2016-10-11 10:46
288 查看
CRITICAL_SECTION只能用于不同线程的互斥,而不能用于同步。因为同一个线程可以多次EnterCriticalSection。。 为什么网上的代码,很多“锁”、“自动锁”的类,都是用CRITICAL_SECTION实现。 如果使用的人不熟悉这个,很容易就会用错呀。
C++多线程之使用Mutex和Critical_Section
Mutex和Critical Section都是主要用于限制多线程(Multithread)对全局或共享的变量、对象或内存空间的访问。下面是其主要的异同点(不同的地方用绿色表示)。
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); |
相关文章推荐
- C++多线程之使用Mutex和Critical_Section
- C++多线程之使用Mutex和Critical_Section
- 使用临界区CRITICAL_SECTION结构对象保护多线程互斥地访问共享资源
- C++多线程之使用Mutex和Critical_Section
- 跨平台的多线程互斥访问控制(Mutex和Critical_Section)
- C++多线程之使用Mutex和Critical_Section
- 关于多线程与CRITICAL_SECTION的使用
- 线程池类(使用C++,pure API,Mutex,Event)
- 【win32多线程】使用C++编写多线程
- C++的长api InitializeCriticalSectionAndSpinCount
- c++ 多线程开发简易工具——OpenMP使用
- 使用临界区 CRITICAL_SECTION 实现互斥
- C++多线程框架 (二)---------Mutex互斥和Sem信号量
- Windows 临界区CRITICAL_SECTION,内核事件Event,互斥量Mutex,信号量Semaphore
- c++CreateEvent函数在多线程中使用及实例
- 多线程(C++)同步Mutex
- c++ 对关键段CRITICAL_SECTION的封装
- CriticalSection vs Mutex
- Mutex与CRITICAL_SECTION的比较
- 使用临界区 CRITICAL_SECTION 实现互斥