互斥对象是系统内核维护的一种数据结构,保证了对象对单个线程的访问权。
一:函数说明
创建互斥对象:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, 安全属性结构指针,可为NULL,表示默认安全性
BOOL bInitialOwner, //是否占有该互斥量,TRUE:占有,FALSE:不占有
LPCTSTR lpName //设置互斥对象的名字
);
获得互斥对象:
DWORD WaitForSingleObject(
HANDLE hHandle, //互斥对象的句柄
DWORD dwMilliseconds //0:测试对象的状态立即返回;INFINITE:对象被触发信号后,函数才会返回
}
释放互斥对象:
BOOL ReleaseMutex(HANDLE hHandle)
二:步骤
声明互斥对象:HANDLE hMutex
创建互斥对象:hMutex = CreateMutex(NULL, FALSE, NULL)
使用互斥对象:WaitForSingleObject(hMutex, INFINITE)
释放互斥对象:ReleaseMutex(hMutex)
三:代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| /******************************************************** Copyright (C), 2016-2018, FileName: t13 Author: woniu201 Created: 2018/10/23 Description: 线程同步-互斥对象 ********************************************************/ #include <iostream> #include <Windows.h> using namespace std; volatile int number = 1; HANDLE hMutex; DWORD CALLBACK ThreadFun1(LPVOID pParam) { while (1) { WaitForSingleObject(hMutex, INFINITE); cout << "Thread1:" << number++ << endl; ReleaseMutex(hMutex); if (number >= 1000) { break; } } return 0; } DWORD CALLBACK ThreadFun2(LPVOID pParam) { while (1) { WaitForSingleObject(hMutex, INFINITE); cout << "Thread2:" << number++ << endl; ReleaseMutex(hMutex); if (number >= 1000) { break; } } return 0; } int main() { hMutex = CreateMutex(NULL, FALSE, NULL); CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL); CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL); getchar(); return 1; }
|