操作系统——Windows 线程的互斥与同步

操作系统实验二——线程的同步 一、 实验目的 (1)进一步掌握windows系统环境下线程的创建和撤销。 (2)熟悉windows系统提供的线程同步API(是WINDOWS提供给应用程序与操作系统的接口)。 (3)使用windows系统提供的线程同步API解决实际问题。 二、 实验准备 实验环境: ... 阅读详情

一、实验题目

Windows 线程的互斥与同步

二、实验目的

(1) 回顾操作系统进程、线程的有关概念,加深对 Windows 线程的理解。

(2) 了解互斥体对象,利用互斥与同步操作编写生产者-消费者问题的并发程序,加深对 P (即 semWait)、V(即 semSignal)原语以及利用 P、V 原语进行进程间同步与互斥操作的理解

三、实验内容(实验原理/运用的理论知识、算法/程序流程图、步骤和方法、关键代码)

生产者消费者问题

步骤 1:创建一个“Win32 Consol Application”工程,然后拷贝清单 5-1 中的程序,编译成可执行

文件。

步骤 2:在“命令提示符”窗口运行步骤 1 中生成的可执行文件,列出运行结果。

步骤 3:仔细阅读源程序,找出创建线程的 WINDOWS API 函数,回答下列问题:线程的第一

个执行函数是什么(从哪里开始执行)?它位于创建线程的 API 函数的第几个参数中?

步骤 4:修改清单 5-1 中的程序,调整生产者线程和消费者线程的个数,使得消费者数目大与

生产者,看看结果有何不同。察看运行结果,从中你可以得出什么结论?

步骤 5:修改清单 5-1 中的程序,按程序注释中的说明修改信号量 EmptySemaphore 的初始化方

法,看看结果有何不同。

步骤 6:根据步骤 4 的结果,并查看 MSDN,回答下列问题:

1)CreateMutex 中有几个参数,各代表什么含义。

2)CreateSemaphore 中有几个参数,各代表什么含义,信号量的初值在第几个参数中。

3)程序中 P、V 原语所对应的实际 Windows API 函数是什么,写出这几条语句。

4)CreateMutex 能用 CreateSemaphore 替代吗?尝试修改程序 5-1,将信号量 Mutex 完全用

CreateSemaphore 及相关函数实现。写出要修改的语句。

问题回答:

步骤 3:

创建线程的Windows API函数是CreateThread。

线程的第一个执行函数是Producer函数(生产者线程的入口函数)。它位于CreateThread的第三个参数lpStartAddress中。

步骤 4:

调整生产者线程和消费者线程的个数,使得消费者数目大于生产者,可以观察到以下结果:

当消费者线程数目大于生产者线程数目时,消费者线程可能更频繁地等待缓冲区中有产品可消费,因此消费者线程的执行速度可能较慢。

生产者线程可能更频繁地生产产品,因为消费者线程较慢消耗产品,缓冲区中可能较少空位,导致生产者线程等待EmptySemaphore的次数增加。

步骤 5:

修改信号量EmptySemaphore的初始化方法,将第二个参数设置为0,即初始化为0个空位,代码示例:EmptySemaphore = CreateSemaphore(NULL, 0, SIZE_OF_BUFFER, NULL)。

结果将导致所有的生产者线程在开始时无法生产产品,因为EmptySemaphore信号量初始为0,生产者线程在WaitForSingleObject(EmptySemaphore, INFINITE)处被阻塞,等待消费者线程消耗产品。

步骤 6:

CreateMutex中有3个参数,各代表的含义如下:

参数1:lpMutexAttributes,指向SECURITY_ATTRIBUTES结构的指针,用于设置互斥对象的安全属性。可以为NULL,表示使用默认的安全属性。

参数2:bInitialOwner,指示是否为调用线程拥有互斥对象的初始所有权。TRUE表示拥有,FALSE表示未拥有。

参数3:lpName,互斥对象的名称。可以为NULL。

CreateSemaphore中有4个参数,各代表的含义如下:

参数1:lpSemaphoreAttributes,指向SECURITY_ATTRIBUTES结构的指针,用于设置信号量的安全属性。可以为NULL,表示使用默认的安全属性。

参数2:lInitialCount,信号量的初始计数器值,即可用的资源数量。

参数3:lMaximumCount,信号量的最大计数器值,即计数器的上限。

参数4:lpName,信号量的名称。可以为NULL。信号量的初值在第二个参数lInitialCount中。

P、V原语所对应的实际Windows API函数是:

P操作对应的是WaitForSingleObject函数,用于等待一个对象的信号状态。

V操作对应的是ReleaseSemaphore函数,用于增加信号量的计数器值。

CreateMutex可以用CreateSemaphore替代,但需要做一些修改:

将CreateMutex修改为CreateSemaphore,同时修改互斥锁的初始化和使用方法。

使用WaitForSingleObject来替代WaitForSingleObject(mutex, INFINITE),等待信号量的状态。

使用ReleaseSemaphore来替代ReleaseMutex(mutex),释放信号量。

修改代码示例:

// 初始化互斥锁

mutex = CreateSemaphore(NULL, 1, 1, NULL);

// 生产者线程

WaitForSingleObject(emptySemaphore, INFINITE);

WaitForSingleObject(mutex, INFINITE);

// ...

ReleaseSemaphore(mutex, 1, NULL);

// 消费者线程

WaitForSingleObject(fullSemaphore, INFINITE);

WaitForSingleObject(mutex, INFINITE);

// ...

ReleaseSemaphore(mutex, 1, NULL);

注意,由于CreateSemaphore初始化的互斥锁计数器初始值为1,所以这里使用了1作为CreateSemaphore的初始计数器值,并在WaitForSingleObject和ReleaseSemaphore中将第二个参数设置为1。

四、实验结果与分析

 

实验结果:

程序创建了多个生产者线程和消费者线程。

生产者线程负责生产产品,每次生产后将产品放入缓冲区。

消费者线程负责从缓冲区中取出产品并消耗。

生产者和消费者之间通过互斥锁(Mutex)和信号量(EmptySemaphore和FullSemaphore)实现同步和互斥。

实验分析:

在主函数中,首先创建了互斥锁(Mutex)和两个信号量(EmptySemaphore和FullSemaphore)。互斥锁用于保护共享资源的访问,信号量用于控制生产者和消费者的同步。

根据设置的生产者和消费者数量,创建了相应数量的线程,并分别执行Producer和Consumer函数。

生产者线程在每次生产产品之前,首先等待EmptySemaphore信号量,确保缓冲区有可用的位置。然后获取互斥锁Mutex,进行生产操作,将产品放入缓冲区,并释放互斥锁Mutex和FullSemaphore信号量。

消费者线程在每次消耗产品之前,首先等待FullSemaphore信号量,确保缓冲区中有可用的产品。然后获取互斥锁Mutex,进行消耗操作,从缓冲区中取出产品,并释放互斥锁Mutex和EmptySemaphore信号量。

在每个生产者和消费者的操作中,通过输出语句打印相关信息,包括生产的产品号、缓冲区的状态以及消费的产品号。

主函数中的while循环用于控制程序的运行,当按下回车键时,设置p_ccontinue为false,结束生产者和消费者的线程运行。

由于涉及多线程和同步操作,实际运行结果可能因为线程调度和竞态条件的不确定性而有所不同。以上分析是一种可能的情况。

需要注意的是,这段代码在创建信号量时有两种方式的注释,可以根据需要进行修改,观察对程序运行的影响。

总的来说,这个实验通过模拟生产者和消费者的行为,展示了线程间同步和互斥的机制。生产者和消费者通过缓冲区进行交互,确保生产者不会在缓冲区满时继续生产,消费者不会在缓冲区空时继续消耗。通过互斥锁和信号量的合理运用,保证了线程的安全和正确的执行顺序。

五、小结与心得体会

1.多线程编程:该实验涉及多线程编程,通过创建多个线程并使用线程同步机制实现线程间的协调与通信。

2.生产者-消费者模型:该实验基于生产者-消费者模型,生产者生成产品并放入缓冲区,消费者从缓冲区中取出产品进行消费。

3.缓冲区的使用:缓冲区被设计为循环队列,使用数组来表示。生产者和消费者通过维护缓冲区的读写指针(in和out)来实现对缓冲区的访问。

4.线程同步与互斥:为了避免生产者和消费者同时访问缓冲区而导致数据不一致的问题,使用互斥信号量(Mutex)进行互斥操作。同时,通过同步信号量(FullSemaphore和EmptySemaphore)实现生产者和消费者之间的同步。

5.线程间通信:生产者和消费者之间通过信号量进行通信和同步,当缓冲区满时生产者等待,当缓冲区空时消费者等待。

6.通过以上实验,可以深入理解多线程编程的概念和技术,以及生产者-消费者模型在多线程环境下的应用。这对于并发编程和系统设计有着重要的意义。

操作系统实验二、进程和线程管理(Windows 2学时)多线程创建 实验二、进程和线程管理(Windows 2学时) 一、实验目的 通过实验使学生进一步了解进程、进程状态、进程控制等基本概念。基本能达到下列具体的目标: 理解进程 PCB 的概念,以及 PCB 如何实现、如何组织以及管理。 加深对进程和线程概念的理解,进一步认识并发执行的本质。 掌握Windows环境中编写程序创建子进程和终止子进程操作。 掌握Windows环境中编写程序创建线程及其管理操作。 阅读详情

相关推荐

操作系统实验四 进程同步与互斥

一、实验目的: 掌握基本的同步与互斥算法,理解P,V操作。 理解生产者消费者模型,了解其它典型的同步互斥模型,如哲学家就餐、读者-写者模型等。 了解LINUX中进程同步互斥的实现方法,掌握相关函数的使用方法。 学习使用Windows中基本的同步对象,掌握相关API的使用方法。 了解Windows中多线程的并发执行机制,实现进程的同步与互斥。 二、实验环境: 一台运行Linux操作系统的计算机。 实验内容: PART1 LINUX环境 1. 生产者-消费者问题 (1)以下给出生产者.

m0_63134982的博客 1万+

操作系统实验:Windows环境下线程的同步与互斥

一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。(2)学会使用CreateMutex() 创建一个互斥对象,返回一个对象句柄;1.说明本次实验后你对使用信号量对象(Semaphore)、临界区对象(CriticalSection)和互斥对象(Mutex)的理解说明。2.说明信号量对象(Semaphore)、临界区对象(CriticalSection)和互斥对象(Mutex)的使用场合及他们的区别?

m0_63002183的博客 1527

淘宝链接跳转微信全攻略:自建合规中转页实现私域引流

在跨平台运营中,链接跳转是连接不同生态、实现流量引导的关键技术。其核心原理是通过服务器端或前端逻辑,将用户从一个平台的链接安全引导至目标页面,同时规避平台间的访问限制。这项技术的核心价值在于打破数据孤岛,实现跨平台用户沉淀与精细化运营,广泛应用于电商引流、私域流量构建和跨平台营销等场景。本文聚焦于**淘宝短链**与**企业微信**之间的跳转难题,提供了一套基于自建中转页面的完整工程解决方案,手把手教你如何通过合规的技术手段,将淘宝流量高效、安全地引导至微信生态,并实现数据追踪与客户分流。

weixin_34185512的博客 408

windows线程同步与互斥

windows线程同步与互斥。临界区对象,事件内核对象,互斥量,信号量

new9232的博客 1448

RK3588设备树调试实战:解决NPU不加载、USB3.0识别异常与DP显示问题

本文深入探讨了RK3588设备树调试中的三大典型问题:NPU不加载、USB3.0识别异常与DP显示问题。通过详细的问题定位步骤、关键设备树修改和调试技巧,帮助开发者快速解决硬件适配中的挑战,提升RK3588平台的开发效率。

weixin_30576827的博客 474

cadence capture CIS 之添加数据库

2021-08-20 cadence capture CIS 之添加数据库准备一、添加数据源 准备 1、数据库文件(*.mdb) 2、电脑上安装好 cadence 软件 一、添加数据源 打开“ ODBC数据源管理器” ( 路径:C:\Windows\SysWOW64\odbcad32.exe ) ...

weixin_42256550的博客 6047

windows 互斥量内核对象 Mutex

互斥量内核对象 Mutex 互斥量内核对象能够确保一个进程独占对一个资源的访问。互斥量与关键段(线程同步方式)的行为完全相同,当互斥量是内核对象,而关键段是用户模式下的的同步对象 互斥量对象包含: 一个线程 ID ,使用计数和递归计数 。线程 ID 表示当前占用该互斥量的线程 ID ,递归计数表示该线程占用互斥量的次数,使用计数表示使用互斥量对象的不同线程的个数 互斥量规则:1.线程I......

baidu_16370559的博客 1301

【Qualcomm高通音频】外部Codec调试流程_ES7243E

一、 调试大纲 调试正式开始之前,想办法获取以下信息:硬件设计原理图/Codec参考驱动代码/FAE联系方式。 1. 从硬件设计原理图,我们要获取到Codec芯片和CPU通过什么接口连接,包括数据传输接口、控制接口、reset和power引脚。 2. Codec参考驱动代码,一般正规的厂商都会提供的,至少也提供对应场景的寄存器配置。 接下来开始正式调试,大致分为以下流程: a. 数据...

crow_ch的博客 8264

操作系统课设-Windows 线程的互斥与同步

Windows 线程的互斥与同步。

jeazim的博客 415

Keil MDK安装NRF52832开发环境全攻略(附系统时间错误解决方案)

本文详细介绍了如何使用Keil MDK搭建NRF52832开发环境,包括基础软件安装、项目配置关键步骤以及常见问题解决方案。特别针对系统时间错误导致的编译失败问题提供了实用解决方法,帮助开发者快速上手NRF52832开发。

weixin_29168153的博客 505

基于YOLOv8的视频监控违规停车智能识别系统与应用研究

通过这个毕设,你已经从数据准备、模型训练到界面开发,完整走了一遍深度学习项目的流程。把多个停车场的监控数据整合起来,做一个区域级的停车管理平台;加入车牌识别功能,直接定位到违规车辆的车主;试试把YOLO模型再优化一下,让它在手机端也能运行,实现移动巡检。相信我,按照这个教程一步步做,你的毕设不仅能顺利完成,还能做出亮点,让答辩老师眼前一亮。要是过程中遇到什么问题,随时可以再琢磨琢磨,或者找我聊聊,咱们一起把这个毕设做成精品。

LXY_LOVE36的博客 117

操作系统课程设计-Windows 线程的互斥和同步

本实验为课设内容,博客内容为部分报告内容,仅为大家提供参考,请勿直接抄袭,另外,本次实验所用平台是dev c++5.11。

qq_63306482的博客 1600

Docker - 基本概念、与虚拟机的区别、架构、镜像操作、容器操作、数据卷挂载

p :将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口(配置映射是因为用户只能通过 http 请求访问到服务器,不能直接访问到对应的容器,因此需要服务器端口与容器端口建立映射关系)这里我们有两种启动 redis 的方式,第一种是直接启动 redis ,第二种是以 AOF 持久化的方式启动容器(--appendonly yes),如下图。如果需要持续查看日志信息可以添加 -f 参数,例如:docker logs -f mn ,这里 mn 是自定义容器名称, ctrl + c 可以停止跟踪。

CYK_byte的博客 1万+

Windows 操作系统提供的函数SetEvent以及ResetEvent,用于操作事件对象。它们属于同步原语函数,用于实现线程同步和互斥

Windows 操作系统提供的函数SetEvent以及ResetEvent,用于操作事件对象。它们属于同步原语函数,用于实现线程同步和互斥

森明帮大于黑虎帮的博客 2956

YOLOv8改进,YOLOv8添加DCNv4可变性卷积(windows系统成功编译),全网最详细教程

DCNv4通过两项关键增强解决了其前身DCNv3的局限性:1. 移除空间聚合中的softmax归一化,以增强其动态特性和表达能力;2. 优化内存访问以最小化冗余操作,从而加速计算。这些改进使得DCNv4相比DCNv3显著加快了收敛速度,并且处理速度大幅提升,前向传播速度超过三倍。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 6467

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

windows多线程同步互斥--总结

博客地址: windows多线程同步互斥--总结

JustDoIT 740

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

windows多线程同步--互斥量

博客地址: windows多线程同步--互斥量

JustDoIT 657

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

操作系统原理实验报告——读者写者

一、实验目的 1.现代操作系统的核心是多道程序设计、多处理器和分布式处理器,这些方案和操作系统设计技术的基础都是并发。当多个进程并发执行时,不论是在多处理器系统的情况下,还是在单处理器多道程序系统中,都会出现冲突和合作的问题。 2.理解操作系统中用互斥和同步解决问题。 3.用信号量机制分别实现读者优先和写者优先的读者-写者问题从而掌握互斥与同步的基本理念。 二、实验内容 在Windows 环境下,创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面有介绍

The_Dan的博客 9175

操作系统实验——进程的同步与互斥(读者写者问题)

操作系统实验——进程的同步与互斥(读者写者问题) 去发现同类优质开源项目:https://gitcode.com/ 此仓库包含一个操作系统实验项目,该项目以生产者消费者模型为基础,在Windows环境下实现了一个控制台进程。进程内部创建了模拟生产者的写者线程和模拟消费者的读者线程。 实验内容 实验的核心是模拟读者写者问题,其中写者线程负责生产数据并将其存入一个共享缓冲区,而读者线程则从缓冲区中读取...

gitblog_06717的博客 462

Linux、windows版本线程互斥锁

#ifndef CONFIG_ENV_H #define CONFIG_ENV_H #define LOCK_NAMESPACE LOCK #define NAMESPACE_BEGIN(x) namespace x { #define NAMESPACE_END } #define

fengdijiang的专栏 1121

Windwos中的线程同步

Windwos中的线程同步 2019年5月23日 9:57 Windows操作系统的运行方式(程序运行方式)为"双模式操作"(Dual-mode Operation)。 用户模式(User mode):运行应用程序的基本模式,禁止访问物理设备,而且会限制访问的内存区域 内核模式(Kernal mode):操作系统运行时的模式,不会限制访问的内存区域,同时访问的硬件...

weixin_30872733的博客 85

【学习笔记】Windows 下线程同步之互斥锁

简介:互斥锁是一种同步对象,当没有任何线程拥有互斥锁时,互斥锁处于有信号(signaled)状态,当互斥锁被某个线程拥有,则它处于无信号状态(nonsignaled)特点任何一个互斥锁,一次只能被一个线程拥有可以跨进程使用,即进程间同步适用场景:同步一些共享资源,比如共享内存(shared memory)

码的世界 2370

windows同步和互斥总结

一、关键段(CRITICAL_SECTION)(非内核对象) 使用关键段进行线程互斥时非常简单,只涉及到以下四个函数 函数功能:初始化 函数原型: void InitializeCriticalSection(LPCRITICAL_SECTION   lpCriticalSection); 函数说明:定义关键段变量后必须先初始化。 函数功能:销毁 函数原型: void Dele

andylauhuang2012的专栏 913

操作系统实验:生产者与消费者问题实验报告及代码

操作系统实验:生产者与消费者问题实验报告及代码 【下载地址】操作系统实验生产者与消费者问题实验报告及代码 本实验项目聚焦于操作系统中的经典同步互斥问题——生产者与消费者问题。通过编写程序,利用Windows API函数,成功实现了生产者与消费者模型的线程创建与同步机制。实验内容涵盖线程设计、信号量使用以及资源安全共享,确...

gitblog_06743的博客 263

【Windows】操作系统之线程同步(第六篇)

线程同步是多线程编程中的一项重要技术,它确保了多线程环境下数据的一致性和程序的正确执行。通过合理的线程同步机制,可以避免竞态条件、死锁等问题,提高程序的稳定性和性能。在实现线程同步时,需要根据具体的应用场景选择合适的同步方法,并遵循良好的编程实践来确保程序的正确性和可维护性。练习题答案:a的最小值是2,最大值是200。

abclui的专栏 866

Windows C++ 内核对象 与多线程 线程同步 互斥对象

1.在windows中子进程和主进程是一起走的,在没有设置的情况下。2.主进程是不会等待子进程的结束后才继续的。1.WaitForSingleObject() 函数会等待一个内核对象的变为已通知状态(结束的时候 就是已通知状态)。2.dwMilliseconds=INFINITE 就是无限期等待3.hHandle是哪个内核对象的Handle。1.用了互斥对象后 我们在子线程的代码中 加入WaitForSingleObject(hMutex, INFINITE);

qq_52528309的博客 1041
上一篇: 操作系统——Linux 进程间通信
下一篇: 操作系统——银行家算法的模拟与实现
jakeonil
博客等级 码龄5年 1万+粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jakeonil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值