CreateMutex互斥对象实现线程同步

CreateMutex互斥对象实现线程同步

《CreateMutex函数》详细总结了互斥体的用法,下面总结下CreateMutex互斥对象在多线程中的应用。
[cpp]#include
#include
#include
using namespace std;

int index = 0;
int tickets = 8;
HANDLE m_hMutex;

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while (true)
{
WaitForSingleObject(m_hMutex, INFINITE);
if (tickets > 0)
cout << "t1: " << tickets-- << endl; else break; ReleaseMutex(m_hMutex); } return 0; } DWORD WINAPI Fun2Proc(LPVOID lpParameter) { while (true) { WaitForSingleObject(m_hMutex, INFINITE); if (tickets>0)
cout << "t2: " << tickets-- << endl; else break; ReleaseMutex(m_hMutex); //注释将占有资源 } return 0; } int main(int argc,char *argv[]) { HANDLE hThread1, hThread2; m_hMutex = CreateMutex(NULL,FALSE, NULL); //TRUE代表主线程拥有互斥对象 需要在主线程中释放该对象,然后线程函数才能执行。 //FLASE代表当前没有线程拥有这个互斥对象 hThread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL); hThread2 = CreateThread(NULL, 0, Fun2Proc, NULL, 0, NULL); CloseHandle(hThread1); CloseHandle(hThread2); //ReleaseMutex(m_hMutex); Sleep(3000); CloseHandle(m_hMutex); return 0; } [/cpp] 线程1和线程2交替运行,运行结果图:

CreateMutex互斥体多线程
CreateMutex互斥体多线程交替运行

主线程占有资源,然后释放,线程1线程2运行,线程2占有资源,运行效果图:

CreateMutex2,线程2占有资源
CreateMutex2

总结:

一、互斥对象是系统内核维护的一种数据结构,它保证了对象对单个线程的访问权 互斥对象的结构:包含了一个使用数量,一个线程ID,一个计数器

  • 使用数量是指有多少个线程在调用该对象;
  • 线程ID是指互斥对象维护的线程的ID;
  • 计数器表示当前线程调用该对象的次数;

二、如果一个线程拥有了一个互斥对象后,当该线程运行完成后就要释放该互斥对象,不然其他的线程得不到互斥对象则无法运行。只有当一个线程释放了互斥对象的控制权后,如果其他进程在等待互斥对象置位,则等待的线程可以得到该互斥对象,等待函数返回,互斥对象被新的线程所拥有。
释放互斥对象的函数是ReleaseMutex();

ReleaseMutex函数原型:BOOL WIANPI ReleaseMutex(HANDLE hMutex);

参考资料:孙鑫VC++教程,MSDNcnblogs博客