实验二 线程的同步
一、实验目的
- 进一步掌握windows系统环境下线程的创建和撤销
- 熟悉windows系统提供的线程同步API(是
WINDOWS提供给应用程序与操作系统的接口) - 使用windows系统提供的线程同步API解决实际问题
二、实验准备
等待对象
等待一个对象 | 等待多个对象 |
---|---|
WaitForSingleObject() | WaitForMultipleObjects() |
在指定时间内等待一个对象 | 在指定时间内等待多个对象 |
等待一个对象
DWORD WaitForSingleObject(
HANDLE hHandle, //对象句柄
DWORD dwMilliseconds //等待时间
);
等待多个对象
DWORD WaitForMultipleObject(
DWORD nCount, //句柄数组中的句柄数
const HANDLE *lpHandle, //指向对象句柄数组的指针
BOOL fwaitALL, //等待类型
DWORD dwMilliseconds //等待时间
);
可等待的对象列表
- Change notification:变化通知
- Console input:控制台输入
- Events:事件
- Job:作业
- Mutex:互斥信号量
- Process:进程
- Semaphore:计数信号量 (本次主要用到)
- Thread:线程 (本次主要用到)
- Wait-able timer:定时器
如何去等待一个对象
-
我们需要立一个Flag,用于在主子线程之间相互告知运行状态。
-
Flag = 信号量
-
创建一个信号量
hHandle1 = CreateSemaphore(NULL, 0,1, "SemaphoreName1");//创建一个信号量(安全标识符,信号量初始态,信号量最大值,信号量名称)
-
打开一个信号量
hHandle1 = OpenSemaphore( SYNCHRONIZE ISEMAPHORE_ MODIFY_ STATE, NULL,"SemaphoreName1" );
-
释放信号量
rc = ReleaseSemaphore (hHandle1, 1, NULL)(我们需要释放的信号量,进行增几的操作,NULL);
-
等待单个对象
dRes = WaitForSingleObject(hHandle1 , INFINITE); // 主线程无限期地等待子线程结束(句柄,如果没有释放无限运行)
-
等待多个对象
dRes = WaitForMultiple0bjects(3, hHandles, 1, INFINITE); //第三个参数为1或true时,等待数组中所有对象完成,为0或者false时满足一个任务结束就可继续执行
三、实验内容
(一)实验内容
实验一 线程的同步之等待单个对象
子线程 | 主线程 |
---|---|
用于制作麻辣香锅,制作用时5秒 | 等待子线程执行完毕,打印“开始食用香锅” |
实验二 线程的同步之等待多个对象
子线程1 | 子线程2 | 子线程3 | 主线程 |
---|---|---|---|
用于制作麻辣香锅,制作用时5秒 | 用于制作什锦菇,制作用时3秒 | 用于制作米饭,制作用时6秒 | 等待多个子线程执行完毕,打印”开动了!“ |
(二)主要代码
实验一主要内容及代码
- 创建一个信号量并打开,创建一个线程,主线程等待子线程结束,释放信号量。
static HANDLE hHandle1 = NULL; //静态变量hHandle1用于存放打开的信号量
void chef(){
//用于执行相关的业务逻辑
printf("麻辣香锅开始制作,预计等待时间5s. \n");
Sleep(5000);
printf("麻辣香锅制作完成! \n");
BOOL rc;
DWORD err;
rc = ReleaseSemaphore(hHandle1,1,NULL); //释放信号量
err = GetLastError(); //检测上一条语句是否执行成功