信号量使用入门

/*演示如何使用semaphore进行互斥访问说明: read1, read2, read3互斥访问, write等三个read读完后才能写,通过信息量进行控制
*/#include<windows.h>
#include<process.h>
#include<iostream>using namespace std;CRITICAL_SECTION cs;				// critical section objecttypedef struct
{HANDLE h1;HANDLE h2;HANDLE h3;HANDLE h4;int a;
}PARAMS, *PPARAMS;void read1(PVOID pvoid)
{while(TRUE){		volatile PPARAMS pparams=(PPARAMS)pvoid;WaitForSingleObject(pparams->h2, INFINITE);EnterCriticalSection(&cs);cout << "读线程1开始读取...\n";cout << (pparams->a) << endl;LeaveCriticalSection(&cs);Sleep(1000);ReleaseSemaphore(pparams->h1, 1, NULL);			// increase count of h1}
}void read2(PVOID pvoid)
{while(TRUE){	volatile PPARAMS pparams=(PPARAMS)pvoid;WaitForSingleObject(pparams->h3, INFINITE);EnterCriticalSection(&cs);cout << "读线程2开始读取...\n";cout << (pparams->a) << endl;LeaveCriticalSection(&cs);Sleep(1000);ReleaseSemaphore(pparams->h1, 1, NULL);}
}void read3(PVOID pvoid)
{while(TRUE){	volatile PPARAMS pparams=(PPARAMS)pvoid;WaitForSingleObject(pparams->h4, INFINITE);		// decrease count of h4EnterCriticalSection(&cs);cout << "读线程3开始读取...\n";cout << (pparams->a) << endl;LeaveCriticalSection(&cs);Sleep(1000);ReleaseSemaphore(pparams->h1, 1, NULL);			// increase count of h1}
}void write(PVOID pvoid)
{while(TRUE){	volatile PPARAMS pparams=(PPARAMS)pvoid;WaitForSingleObject(pparams->h1, INFINITE);		// decrease count of h1WaitForSingleObject(pparams->h1, INFINITE);WaitForSingleObject(pparams->h1, INFINITE);cout << "\n=================\n";cout << "写线程开始写入...\n";pparams->a = rand() % 256;cout << "写入" << (pparams->a) << endl;ReleaseSemaphore(pparams->h2, 1, NULL);			// increase count of h2ReleaseSemaphore(pparams->h3, 1, NULL);ReleaseSemaphore(pparams->h4, 1, NULL);}
}int main()
{PARAMS params;params.h1 = CreateSemaphore(NULL, 3, 3, NULL);	// create semaphore1params.h2 = CreateSemaphore(NULL, 0, 1, NULL);	// create semaphore2params.h3 = CreateSemaphore(NULL, 0, 1, NULL);params.h4 = CreateSemaphore(NULL, 0, 1, NULL);InitializeCriticalSection(&cs);					// init critical section object_beginthread(read1, 0, ¶ms);				// create thread to execute read1()_beginthread(read2, 0, ¶ms);_beginthread(read3, 0, ¶ms);_beginthread(write, 0, ¶ms);Sleep(10 * 1000);								// sleep 10 seconds, waiting for the above threads to running,// or the main thread will quickly exit, then these sub-threads have no time to run// so you will see no outputDeleteCriticalSection(&cs);return 0;
}/*程序运行情况:=================
写线程开始写入...
写入41
读线程2开始读取...
41
读线程1开始读取...
41
读线程3开始读取...
41=================
写线程开始写入...
写入35
读线程1开始读取...
35
读线程3开始读取...
35
读线程2开始读取...
35=================
写线程开始写入...
写入190
读线程1开始读取...
190
读线程3开始读取...
190
读线程2开始读取...
190=================
写线程开始写入...
写入132
读线程1开始读取...
132
读线程3开始读取...
132
读线程2开始读取...
132=================
写线程开始写入...
写入225
读线程1开始读取...
225
读线程3开始读取...
225
读线程2开始读取...
225=================
写线程开始写入...
写入108
读线程1开始读取...
108
读线程3开始读取...
108
读线程2开始读取...
108=================
写线程开始写入...
写入214
读线程1开始读取...
214
读线程3开始读取...
214
读线程2开始读取...
214=================
写线程开始写入...
写入174
读线程2开始读取...
174
读线程1开始读取...
174
读线程3开始读取...
174=================
写线程开始写入...
写入82
读线程1开始读取...
82
读线程3开始读取...
82
读线程2开始读取...
82=================
写线程开始写入...
写入144
读线程3开始读取...
144
读线程2开始读取...
144
读线程1开始读取...
144*/


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IEEE1459功率理论计算方法

0、ADC采集5通道电压&#xff08;ABCN地&#xff09;&#xff0c;4通道电流采用每周波1024点同步采样 1、计算各相&#xff08;Ua、Ub、Uc&#xff09;、线电压&#xff08;Uab、Uac、Ubc&#xff09;&#xff0c;相电流&#xff08;Ia、Ib、Ic&#xff09; 2、计算各相电压、…

python webdriver 常用元素操作

1、新建实例 xx_driver os.path.abspath(r"路径") os.environ["webdriver.xx.driver"] xx_driver driver webdriver.xx(xx_driver) 2、id、name、tag、css、link_text、xpath元素定位 driver.find_element_by_id("xxx") driver.find_element_…

[react] React中怎么检验props?

[react] React中怎么检验props&#xff1f; PropTypes 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

HIPS 自定义框架

整理&#xff1a;Baker 2011.8.17 特别感谢zengjian96帮我排版 对关键程序注入运行防护&#xff1a; *.bat *.cmd *.com *.dll *.drv *.exe *.lnk *.ocx *.pif *.scr *.sys 关键文件/程序防护&#xff1a; Cacls.exe cmd.exe command.com cscript.exe csrss.exel debug.exe d…

使用Visio 2000逆向工程将代码转换为UML图表

From: http://www.sudu.cn/info/html/website/20080508/307109.html 摘要&#xff1a;Microsoft Visio 2000 Professional Edition 和 Enterprise Edition 包含通过逆向工程将 Microsoft Visual C、Microsoft Visual Basic 和 Microsoft Visual J 代码转换为统一建模语言 (UM…

POJ1177 Picture 线段树+离散化+扫描线

求最终的覆盖图形周长&#xff0c;写这种代码应该短而精确&#xff0c;差的比较远 /* Problem: 1177 User: 96655 Memory: 348K Time: 32MS Language: C Result: Accepted */ #include<iostream> #include<stdio.h> #include<stdlib.h>…

DA模拟量控制外接600V高压直流源-设计分析

一、STM32 12位AD DA线性度测试 配置STM32 DA为12bit输出&#xff0c;AD为12bit检测&#xff0c;测试AD和DA的线性度与误差。DAC从0到2.49V步进1mV。ErrorDAC 为标准值减去 ADC的测量值。 板子的Vref2.5V&#xff0c;ADC和DAC的极限为2.5V&#xff0c;测试时直接用杜邦线连接…

[react] React的displayName有什么作用?

[react] React的displayName有什么作用&#xff1f; displayName:定义调试时的组件name 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

使用 rose 将 c++代码转换为 uml 类图

From: http://www.cppblog.com/prayer/archive/2009/12/24/103954.html 阅读本文章&#xff0c;你需要对 uml 有简单的了解&#xff0c;懂得以下术语&#xff1a; 类图( class diagram ) 即 c 中的 class 。 聚合( Aggregation ) 即我们c中的引用。表现为 class 头文件中的…

android中的AIDL进程间通信

关于IPC应该不用多介绍了&#xff0c;Android系统中的进程之间不能共享内存&#xff0c;那么如果两个不同的应用程序之间需要通讯怎么办呢&#xff1f;比如公司的一个项目要更新&#xff0c;产品的需求是依附于当前项目开发一个插件&#xff0c;但是呢这个插件功能以及界面比较…

某测试仪控制系统的设计方案--ARM+FPGA+NIOS

一、系统要求 控制功能&#xff1a;600V直流电源模块控制63dB程控衰减器触摸屏高频毫伏表示波器USB存储FAR计数整形阈值调节。 功能要求&#xff1a; 检测高压电源的Vref控制高压电源的Vset控制光脉冲幅度控制阈值计数幅度存储测量数据触摸屏通信示波器通信高频毫伏表通信光…

[react] 为什么属性使用className而不是class呢?

[react] 为什么属性使用className而不是class呢&#xff1f; class是关键字js会使用dom.className获取样式名&#xff0c;跟js保持一致 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣…

QT实现图像处理-傅立叶变换、傅立叶反变换、平滑、锐化与模板匹配

From: http://www.cnblogs.com/qytan36/archive/2010/04/04/1704226.html 实验环境&#xff1a; 1&#xff0c;Linux操作系统 2&#xff0c;QT3编程开发环境 3&#xff0c;C编程语言 傅立叶变换和傅立叶反变换 1.1. 主要源代码 readImage() 从图像中读取数据 writeImage() 往图…

Java finally语句到底是在return之前还是之后执行?

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行&#xff1f;很多人都说不是&#xff0c;当然他们的回答是正确的&#xff0c;经过我试验&#xff0c;至少有两种情况下finally语句是不会被执行的&#xff1a; &#xff08;1&…

TLV5618 双路12位DAC 模拟SPI驱动

一、TLV65618芯片 TLV5618A 带掉电功能 2.7V-5.5V&#xff0c;低功耗双路 12 位数模转换器 特点 ●双路 12 位电压输出 DAC ●可编程调节转换时间 - 快速模式 3μs - 低速模式 10μs ●兼容 TMS320 和 SPI 串行接口 16位串行接口包含4位控制和12位数据。 二、驱动代码 采用模…

[react] React中你有使用过propType吗?它有什么作用?

[react] React中你有使用过propType吗&#xff1f;它有什么作用&#xff1f; 校验属性的合法性 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

python对json的相关操作

From: http://www.cnblogs.com/coser/archive/2011/12/14/2287739.html 什么是json&#xff1a; JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3r…

UIbutton

第一、UIButton的定义 UIButton *button[[UIButton buttonWithType:(UIButtonType); 能够定义的button类型有以下6种&#xff0c; typedef enum { UIButtonTypeCustom 0, 自定义风格 UIButtonTypeRoundedRect, 圆角矩形 UIButtonTypeDetailDisclosure, 蓝色小箭头按钮&#xf…

MAX535 单路13位DAC 模拟SPI驱动

一、MAX535 max535是低功耗、13位、电压输出DAC&#xff0c;采用串行接口和MAX封装。MAX535通过单个5V/3.3V电源工作&#xff0c;仅需要280A电流工作。 MAX535/MAX5351适用于广泛的应用&#xff0c;包括工业过程控制。其他功能包括软件关机和开机复位。 DAC寄存器可以独立更…

[react] react多个setState调用的原理是什么?

[react] react多个setState调用的原理是什么&#xff1f; 同步调用多个setState&#xff0c;React并不会连续多次的进行更新操作&#xff0c;而是会将同步中的多个setState操作合成一个&#xff0c;只执行一次render操作 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前…