windows C++多线程同步<3>-互斥量
概念,如下图:
另外就是互斥对象谁拥有,谁释放
那么一个线程允许多次获取互斥对象吗?
答案是允许,但是申请多次就要释放多次,否则其他线程获取不到互斥对象;同一个线程可以多次获取,即使不释放也可以,但是这种做法有问题极易导致线程同步出现异常,强烈不建议使用;
互斥对象和事件对象两者都是内核对象,使用方法也几乎相同;
常用API
WaitForSingleObject(g_cs , INFINITE);
获取互斥对象
ReleaseMutex(g_cs);
释放互斥对象
#include<iostream>
#include<Windows.h>
using namespace std;
HANDLE g_cs;
int ticks =100;
DWORD WINAPI Func1(LPVOID lpParameter)
{
while(true)
{
WaitForSingleObject(g_cs , INFINITE);
if(ticks>0)
{
cout<<"thread1 "<<ticks<<endl;
ticks--;
ReleaseMutex(g_cs);
}
else
{
ReleaseMutex(g_cs);
break;
}
}
return 0;
}
DWORD WINAPI Func2(LPVOID lpParameter)
{
while(true)
{
WaitForSingleObject(g_cs , INFINITE);
if(ticks>0)
{
cout<<"thread2 "<<ticks<<endl;
ticks--;
ReleaseMutex(g_cs);
}
else
{
ReleaseMutex(g_cs);
break;
}
}
return 0;
}
int main()
{
g_cs = CreateMutex(NULL,FALSE , NULL);
HANDLE hThread1;
HANDLE hThread2;
hThread1 = CreateThread(NULL , 0 ,Func1,NULL,0,NULL);
hThread1 = CreateThread(NULL , 0 ,Func2,NULL,0,NULL);
Sleep(2000);
return 0;
}