Mutex
1.C++使用内核对象互斥体(Mutex)来实现线程同步锁。
2.当两个或更多线程需要同时访问一个共享资源时,Mutex可以只向一个线程授予对共享资源的独占访问权。
3.如果一个线程获取了互斥体,这要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。
创建互斥体
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL binitialOwner,
LPCTSTR lpName);
参数:
lpMutexAttributes: 安全属性,一般设为NULL。
binitialOwner: TRUE表示调用互斥对象的线程获得互斥对象的所有权
FALSE表示不拥有。
lpName: 表示互斥量的名称,传入NULL表示匿名互斥量。
返回值:
成功: 1. 返回句柄.
2. 如果创建已有的互斥量,那么返回已经存在的信号量句柄.
3.GetLastError也会设为ERROR_ALREADY_EXISTS.(与信号量功能一样)
失败: 返回NULL。
释放线程拥有的互斥体的控制权
BOOL WINAPI ReleaseMutex ( HANDLE hMutex);
参数:
hMutex: 互斥体的句柄。
返回值:
TRUE 成功, FALSE 失败。
可用CloseHandle(hMutex) 关闭内核对象 使计数-1(不销毁)
#include <process.h>
#include <windows.h>
#include <stdio.h>
int tickets = 100;
HANDLE hMutex = INVALID_HANDLE_VALUE;
void Fun1(void * paramer);
void Fun2(void * paramer);
int main()
{
hMutex = CreateMutex(NULL, FALSE, NULL);
printf("开始售票!\n");
HANDLE h1 = (HANDLE)_beginthread(Fun1, 0, "A");
HANDLE h2 = (HANDLE)_beginthread(Fun2, 0, "B");
HANDLE hArry[] = { h1,h2 };
WaitForMultipleObjects(2, hArry, true, INFINITE);
printf("结束售票!\n");
getchar();
return 0;
}
void Fun1(void * paramer)
{
char * name = (char*)paramer;
while (tickets > 0)
{
WaitForSingleObject(hMutex,INFINITE);
if (tickets > 0)
printf("%s窗口卖出第%d张票!\n", name, tickets--);
ReleaseMutex(hMutex);
}
}
void Fun2(void * paramer)
{
char * name = (char*)paramer;
while (tickets > 0)
{
WaitForSingleObject(hMutex,INFINITE);
if (tickets > 0)
printf("%s窗口卖出第%d张票!\n", name, tickets--);
ReleaseMutex(hMutex);
}
}