互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
互斥量包含的几个操作原语:
CreateMutex() 创建一个互斥量
OpenMutex() 打开一个互斥量
ReleaseMutex() 释放互斥量
WaitForSingleObject() 等待互斥量对象
互斥量包含的几个操作原语:
CreateMutex() 创建一个互斥量
OpenMutex() 打开一个互斥量
ReleaseMutex() 释放互斥量
WaitForSingleObject() 等待互斥量对象
使用互斥量实现线程同步的代码:
#include <windows.h>
#include <stdio.h>
HANDLE g_hMutex = NULL;
int tickets = 100;
BOOL bThreadStart = TRUE;
DWORD WINAPI FUNCPROC1(LPVOID lpParam);
DWORD WINAPI FUNCPROC2(LPVOID lpParam);
int main()
{
g_hMutex = CreateMutex(NULL, FALSE, NULL);
HANDLE hThread1 = CreateThread(NULL, 0, FUNCPROC1, NULL, 0, NULL);
HANDLE hThread2 = CreateThread(NULL, 0, FUNCPROC2, NULL, 0, NULL);
getchar();
bThreadStart = FALSE;
if (WAIT_TIMEOUT == WaitForSingleObject(hThread1, 3000))
TerminateThread(hThread1, 0);
CloseHandle(hThread1);
if (WAIT_TIMEOUT == WaitForSingleObject(hThread2, 3000))
TerminateThread(hThread2, 0);
CloseHandle(hThread2);
CloseHandle(g_hMutex);
return 0;
}
DWORD WINAPI FUNCPROC1(LPVOID lpParam)
{
while(bThreadStart)
{
WaitForSingleObject(g_hMutex, INFINITE);
if (tickets > 0)
{
printf("thread1 sell ticket: %d\n", tickets--);
ReleaseMutex(g_hMutex);
}
else
{
ReleaseMutex(g_hMutex);
break;
}
}
return 0;
}
DWORD WINAPI FUNCPROC2(LPVOID lpParam)
{
while(bThreadStart)
{
WaitForSingleObject(g_hMutex, INFINITE);
if (tickets > 0)
{
printf("thread2 sell ticket: %d\n", tickets--);
ReleaseMutex(g_hMutex);
}
else
{
ReleaseMutex(g_hMutex);
break;
}
}
return 0;
}
本文介绍互斥量的概念及其在多线程环境中的应用,通过实例代码演示如何使用互斥量实现线程间的资源安全共享。
1234

被折叠的 条评论
为什么被折叠?



