多线程(C++)同步Mutex
来源:互联网 发布:网络红人主播国模思瑞 编辑:程序博客网 时间:2024/05/16 01:10
一 Mutex
互斥对象的使用规则如下:
? 如果线程ID是0(这是个无效ID),互斥对象不被任何线程所拥有,并且发出该互斥对象的通知信号。
? 如果ID是个非0数字,那么一个线程就拥有互斥对象,并且不发出该互斥对象的通知信号。
? 与所有其他内核对象不同, 互斥对象在操作系统中拥有特殊的代码,允许它们违反正常的规则。
若要使用互斥对象,必须有一个进程首先调用CreateMutex,以便创建互斥对象:
HANDLECreateMutex(
如果为fInitialOwner参数传递TRUE,那么该对象的线程ID被设置为调用线程的ID,递归计数器被设置为1。由于ID是个非0数字,因此该互斥对象开始时不发出通知信号。
通过调用一个等待函数,并传递负责保护资源的互斥对象的句柄,线程就能够获得对共享资源的访问权。在内部,等待函数要检查线程的ID,以了解它是否 是0(互斥对象发出通知信号)。如果线程ID是0,那么该线程ID被设置为调用线程的ID,递归计数器被设置为1,同时,调用线程保持可调度状态。
如果等待函数发现ID不是0(不发出互斥对象的通知信号),那么调用线程便进入等待状态。系统将记住这个情况,并且在互斥对象的ID重新设置为0 时,将线程ID设置为等待线程的ID,将递归计数器设置为1,并且允许等待线程再次成为可调度线程。与所有情况一样,对互斥内核对象进行的检查和修改都是 以原子操作方式进行的。
一旦线程成功地等待到一个互斥对象,该线程就知道它已经拥有对受保护资源的独占访问权。试图访问该资源的任何其他线程(通过等待相同的互斥对象)均 被置于等待状态中。当目前拥有对资源的访问权的线程不再需要它的访问权时,它必须调用ReleaseMutex函数来释放该互斥对象:
BOOL ReleaseMutex(HANDLE hMutex);
该函数将对象的递归计数器递减1。
当该对象变为已通知状态时,系统要查看是否有任何线程正在等待互斥对象。如果有,系统将“按公平原则”选定等待线程中的一个,为它赋予互斥对象的所 有权。当然,这意味着线程I D被设置为选定的线程的ID,并且递归计数器被置为1。如果没有其他线程正在等待互斥对象,那么该互斥对象将保持已通知状态,这样,等待互斥对象的下一个 线程就立即可以得到互斥对象。
二 API
三 实例
来自msdn的实例:在线程函数中有一个循环,在每个循环的开始都取得Mutex,然后对全局或静态操作,相当于在关键代码段操作,然后在使用完以后释放它,大家可以执行,查看结果。
#include
#define
HANDLE
DWORD
}
DWORD
}
- 多线程(C++)同步Mutex
- 多线程(C++)同步Mutex
- 多线程--同步(Mutex互斥量)
- 用mutex同步多线程
- 多线程同步-mutex
- 多线程同步Mutex
- C++——多线程编程(二)std::mutex 线程同步、解决资源竞争问题
- QNX多线程同步之Mutex
- 多线程之线程同步Mutex
- C#多线程同步(二)【Mutex】
- WIN32多线程四 线程同步机制Mutex(转)
- 多线程同步之Mutex(互斥对象)
- 多线程同步-互斥对象(深入理解Mutex)
- C++多线程同步(采用互斥对象Mutex)
- Mutex线程同步 (C/C++ Windows Platform SDK 实现)
- Linux操作系统多线程同步Mutex详细介绍
- Linux操作系统多线程同步Mutex详细介绍
- Linux操作系统多线程同步Mutex详细介绍
- ajax那点事
- 多线程(C++)同步Semaphore
- C++Event机制的简单实现
- struts2 内建校验(email、regx等)报错,解决方法(jar包版本问题)!!!
- 如何解决从VBA中复制出的代码是乱码这一问题
- 多线程(C++)同步Mutex
- error opening trace file:No such file or drectory(2),Unable to start activity ComponentInfo
- 貌似被空格坑了
- 深入理解HTTP协议(转)
- 如何理解java中的依赖注入 通过构造函数和反射机制来实现的
- I18N的一些参考示例
- notepad++ 去行号:正则匹配
- cmd 命令 之 dir 之 强化使用
- qt