控制台下实现简单的线程同步--互斥量

1、场景模拟:

(1)有两个售票员正在售票;

(2)一共有10张票待售;

(3)两个售票员一个是老婆婆(动作比较慢),另一个是年轻女孩(动作比较快);


2、代码实现:

(1)两个售票员用两个线程来表示;

(2)用一个全局变量表示票数;


3、实现如下:

// ThredSyn.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Windows.h"
#include "process.h"

int g_tickets = 10;

void sale1(void*);
void sale2(void*);

int _tmain(int argc, _TCHAR* argv[])
{
	_beginthread(sale1, 0, NULL);
	_beginthread(sale2, 0, NULL);

	getchar();
	return 0;
}

void sale1(void*)
{
	while (g_tickets > 0)
	{
		Sleep(10);
		printf("saler1:%d\n", g_tickets--);
	}
}

void sale2(void*)
{
	while (g_tickets > 0)
	{
		printf("saler2:%d\n", g_tickets--);
	}
}

4、运行如下:




5、可以看到出错了,saler2(年轻女孩)把票都卖完了,但是老婆婆还在继续卖票(saler1:0).


6、可通过互斥量来实现线程同步:

// ThredSyn2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Windows.h"
#include "process.h"

int g_tickets = 10;
HANDLE hMutex;

void sale1(void*);
void sale2(void*);

int _tmain(int argc, _TCHAR* argv[])
{
	hMutex = CreateMutex(NULL, TRUE, NULL);

	_beginthread(sale1, 0, NULL);
	_beginthread(sale2, 0, NULL);

	ReleaseMutex(hMutex);

	getchar();
	CloseHandle(hMutex);
	return 0;
}

void sale1(void*)
{
	while (g_tickets > 0)
	{
		WaitForSingleObject(hMutex, INFINITE);
		if (g_tickets > 0)
		{
			Sleep(10);
			printf("saler1:%d\n", g_tickets--);
			ReleaseMutex(hMutex);
		}
		else
		{
			ReleaseMutex(hMutex);
		}
	}
}

void sale2(void*)
{
	while (g_tickets > 0)
	{
		WaitForSingleObject(hMutex, INFINITE);
		if (g_tickets > 0)
		{
			printf("saler2:%d\n", g_tickets--);
			ReleaseMutex(hMutex);
		}
		else
		{
			ReleaseMutex(hMutex);
		}
	}
}



7、正确了:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值