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、正确了: