线程的同步实验

该实验旨在深入理解Windows环境中线程的创建、撤销和同步。通过使用线程同步API,如信号量、事件、互斥量等,解决实际问题。实验包括等待单个和多个对象,涉及创建、打开、释放信号量以及线程间的等待操作。实验结果显示了成功实现线程同步,并在实验总结中提到在某些情况下释放信号量的操作存在问题。
摘要由CSDN通过智能技术生成

实验二 线程的同步

一、实验目的

  1. 进一步掌握windows系统环境下线程的创建和撤销
  2. 熟悉windows系统提供的线程同步API(是
    WINDOWS提供给应用程序与操作系统的接口)
  3. 使用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:定时器

如何去等待一个对象

  1. 我们需要立一个Flag,用于在主子线程之间相互告知运行状态。

  2. Flag = 信号量

  3. 创建一个信号量

    hHandle1 = CreateSemaphore(NULL, 0,1, "SemaphoreName1");//创建一个信号量(安全标识符,信号量初始态,信号量最大值,信号量名称)

  4. 打开一个信号量

    hHandle1 = OpenSemaphore( SYNCHRONIZE ISEMAPHORE_ MODIFY_ STATE, NULL,"SemaphoreName1" );

  5. 释放信号量

    rc = ReleaseSemaphore (hHandle1, 1, NULL)(我们需要释放的信号量,进行增几的操作,NULL);

  6. 等待单个对象

    dRes = WaitForSingleObject(hHandle1 , INFINITE); // 主线程无限期地等待子线程结束(句柄,如果没有释放无限运行)

  7. 等待多个对象

    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();							//检测上一条语句是否执行成功
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值