互斥量

本文介绍互斥量的概念及其在多线程环境中的应用,通过实例代码演示如何使用互斥量实现线程间的资源安全共享。
互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。 

互斥量包含的几个操作原语:
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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值