// 线程关键区五人抢厕所.cpp : 定义控制台应用程序的入口点。
// 5个线程进行存尿和上厕所的循环。厕所(临界区)同一时间只能一人用。
//每个线程上完5次厕所即结束本线程
#include "stdafx.h"
#include <windows.h>
#include<time.h> //为了用time(0)当随机种子
//定义临界区对象
CRITICAL_SECTION bathroom;
DWORD WINAPI seize_bathroom(LPVOID lpParam);
int main()
{
DWORD ThreadId;
HANDLE hThread[5];
//初始化临界区对象
InitializeCriticalSection(&bathroom);
//创建5个线程
for (int i = 0; i<5; i++)
{
hThread[i] = CreateThread(NULL, NULL, seize_bathroom, LPVOID(i + 1), 0, &ThreadId);
//创建线程时会自动运行seize_bathroom函数
//在被调函数中 识别是哪个线程在调用函数,用的是LPVOID那个位置的参数
//此 线程创建方法 和 函数调用方法 必须看懂
printf("第%d号线程创建成功\n", i + 1);
}
//等待五个线程运行结束
WaitForMultipleObjects(5, hThread, true, INFINITE);
//删除临界区对象
DeleteCriticalSection(&bathroom);
::system("PAUSE");
return 0;
}
DWORD WINAPI seize_bathroom(LPVOID lpParam)
{
//得到 线程序号
int n = (int)lpParam;
int peetime = 5; //每个线程上完5次厕所即结束
//随机产生尿意时间 2-12秒 即2000-12000毫秒 如厕时间1秒
srand(time(0));
while (peetime--)
{
srand(time(0)*n);
int sleeptime0 = rand() % 12000 + 2000;
int sleeptime = sleeptime0/10;
Sleep(sleeptime);
printf(" %d 号线程产生了尿意 耗时%d \n", n,sleeptime0);
EnterCriticalSection(&bathroom); //进入临界区
printf("%d 号线程第 %d 次进入了厕所 \n", n,(5-peetime));
Sleep(100);
//出临界区
printf(" %d 号线程离开了厕所 \n\n", n);
LeaveCriticalSection(&bathroom);
}
printf("第%d号线程结束运行\n", n);
return 0;
}