1、互斥量
互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问。互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线程互斥访问资源。
2、互斥量使用
(1)创建互斥量
HANDLE CreateM(
LPSECURITY_ATTRIBUTES lpMutexAttibutes, //安全控制
BOOL bInitialOwner, //初始化的拥有者,谁初始拥有其执行权
LPCTSTR lpName);
(2)打开互斥量
HANDLE OpenMutex(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName
);
(3)等待互斥量
DWORD WaitForSingleObject(
HANDLE hHandle, //互斥量句柄
DWORD dwMIlliseconds // time-out interval 等候的超时时间
);
(4)释放互斥量
BOOL ReleaseMutex(
HANDLE hMutex //互斥量句柄
);
3、代码示例
#include <iostream>
#include <Windows.h>
using namespace std;
static int number = 10;
HANDLE Mutex1, Mutex2;
DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
cout << "窗口1售票开始"<< endl;
while (1)
{
WaitForSingleObject(Mutex1, INFINITE);
if (number > 0)
{
cout << "窗口1售出第" << number << "张票" << endl;
--number;
Sleep(1000);
}
ReleaseMutex(Mutex2);
}
return 0;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
cout << "窗口2售票开始" << endl;
while (1)
{
WaitForSingleObject(Mutex2, INFINITE);
if (number > 0)
{
cout << "窗口2售出第" << number << "张票" << endl;
--number;
Sleep(1000);
}
ReleaseMutex(Mutex1);
}
return 0;
}
int main()
{
HANDLE HOne, HTwo;
HOne = CreateThread(NULL, 0, ThreadOne, NULL, 0, NULL);
HTwo = CreateThread(NULL, 0, ThreadTwo, NULL, 0, NULL);
Mutex1 = CreateMutex(NULL, FALSE, NULL);
Mutex2 = CreateMutex(NULL, FALSE, NULL);
CloseHandle(HOne);
CloseHandle(HTwo);
while (TRUE)
{
if (number == 0)
{
cout << "不好意思,票卖完了!" << endl;
CloseHandle(Mutex1);
CloseHandle(Mutex2);
return 0;
}
else
{
continue;
}
}
system("Pause");
return 0;
}