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、可通过临界区来实现线程同步(快但不公平):

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

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

int g_tickets = 10;
CRITICAL_SECTION g_cs;

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

int _tmain(int argc, _TCHAR* argv[])
{
	InitializeCriticalSection(&g_cs);

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

	getchar();
	DeleteCriticalSection(&g_cs);
	return 0;
}

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

void sale2(void*)
{
	while (g_tickets > 0)
	{
		EnterCriticalSection(&g_cs);
		if (g_tickets > 0)
		{
			printf("saler1:%d\n", g_tickets--);
			LeaveCriticalSection(&g_cs);
		}
		else
		{
			LeaveCriticalSection(&g_cs);
		}
	}
}






7、正确了:

控制台下实现简单的线程同步--临界区_线程同步_02