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交替运行,运行结果图:
主线程占有资源,然后释放,线程1线程2运行,线程2占有资源,运行效果图:
总结:
一、互斥对象是系统内核维护的一种数据结构,它保证了对象对单个线程的访问权 互斥对象的结构:包含了一个使用数量,一个线程ID,一个计数器
- 使用数量是指有多少个线程在调用该对象;
- 线程ID是指互斥对象维护的线程的ID;
- 计数器表示当前线程调用该对象的次数;
二、如果一个线程拥有了一个互斥对象后,当该线程运行完成后就要释放该互斥对象,不然其他的线程得不到互斥对象则无法运行。只有当一个线程释放了互斥对象的控制权后,如果其他进程在等待互斥对象置位,则等待的线程可以得到该互斥对象,等待函数返回,互斥对象被新的线程所拥有。
释放互斥对象的函数是ReleaseMutex();
ReleaseMutex函数原型:BOOL WIANPI ReleaseMutex(HANDLE hMutex);