线程的同步实验

实验二 线程的同步

一、实验目的

  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();							//检测上一条语句是否执行成功
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的 (1)掌握Windows系统提供的线程创建与撤销系统调用 (2)掌握Windows系统环境下线程的创建与撤销方法 2 实验准备知识 (1)线程创建 CreateThread()完成线程的创建。它在调用进程的地址空间上创建一个线程,执行指定的函数,并返回新建立线程的句柄。 原型: HANDLE CreateThread(   LPSECURITY_ATTRIBUTES lpThreadAttributes,   DWORD dwStackSize,   LPTHREAD_START_ROUTINE lpStartAddress,   LPVOID lpParameter,   DWORD dwCreationFlags,   LPDWORD lpThreadId);   参数说明:   lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL,表示使用缺省值。   dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。   lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:   DWORD WINAPI ThreadProc (LPVOID pParam) ,格式不正确将无法调用成功。   lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。   dwCreationFlags :线程标志,可取值如下   CREATE_SUSPENDED: 创建一个挂起的线程   0 :创建后立即激活。   lpThreadId:保存新线程的id。   返回值:   函数成功,返回线程句柄;函数失败返回false。 (2)撤销线程 ExitThread()用于撤销当前线程 原型: VOID ExitThread( DWORD dwExitCode ); 参数说明: DwExitCode:指定线程返回码 返回值: 该函数没有返回值 用法举例: ExitThread(0); (3)挂起线程 Sleep()用于挂起当前正在执行的线程 原型: VOID Sleep( DWORD dwMilliseconds ); 参数说明: dwMilliseconds:指定挂起时间,单位为ms(毫秒)。 返回值: 该函数没有返回值。 (4)关闭句柄 函数CloseHandle()用于关闭已打开对象的句柄,其作用与释放动态申请的内存空间类似,这样可以释放系统资源,使进程安全运行。 原型: BOOL CloseHandle( HANDLE hObject ); 参数说明: hObject:已打开对象的句柄。 返回值: 成功,返回值为非0值;失败,则返回值为0.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值