ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

win32 semaphore(信号量)

2022-07-30 21:31:25  阅读:191  来源: 互联网

标签:信号量 HANDLE 句柄 win32 互斥 线程 semaphore BOOL


线程同步

1.原子锁(原子锁只能对运算符进行操作,可以通过flag简易实现)

产生原因

多个线程对一个数据进行原子操作,就会导致结果丢失。比如 -- 或者 ++
	//原子锁函数,在任何一个时间只能有一个线程访问
	InterlockedXXX();

2.互斥

产生原因

多线程下面代码或者资源的使用

特点

在同一个时间下面,只能有一个线程具有互斥的特性(独占,排他),互斥句柄被持有的时候表现为无信号
没有被持有表现为有信号[可不可以被持有],WaitForXXX的时候,先等先得到

互斥的使用

互斥句柄式有状态的句柄

HANDLE CreateMutex(    //创建成功返回互斥句柄,可以锁定多行代码
	LPSECURITY_ATTRIBUTES lpMutexAttributes,	//指向安全属性的指针,废弃
	BOOL bInitialOwner,	//标志初始所有权
	LPCTSTR lpName	//指向mutex对象名称的指针
);

//释放互斥句柄
BOOL ReleaseMutex(HANDLE hMutex);
//关闭互斥句柄
CloseHandle();

互斥句柄的理解

也是相当于一把锁,拿着的时候,锁上来做事情,同样在等待锁(互斥句柄)的线程就得等待
//实例


前面两个都是资源的抢占(都是加锁实现的)

3.事件(句柄为可等候句柄[事件的句柄可以有多个])

解决线程之间的协调工作

HANDLE CreateEvent(      //程序员自己控制是否有信号
	LPSECURITY_ATTRIBUTES lpEventAttributes,	//指向安全属性的指针
	BOOL bManualReset,	//手动重置事件的标志。TRUE表示手动设置,FALSE:自动[表示的是在等待Event有信号之后操作系统给我们设置为无信号]
	BOOL bInitialState,	//事件为初始状态 TRUE:有信号
	LPCTSTR lpName      //事件命名
);

4.信号量(作用类似于事件)信号量句柄是可等候句柄[有信号就通过,没信号就不能通过]

HANDLE CreateSemaphore(
	LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,	//指向安全属性的指针
	LONG lInitialCount,	//初始计数值,然后等一次,然后 -- 知道0的时候就阻塞在WaitFor ,该值为0的时候表示无信号
	LONG lMaximumCount,	//最大计数值Max
	LPCTSTR lpName		//指向信号量对象名称的指针
)

BOOL ReleaseSemaphore(
	HANDLE hSemaphore,       //
	LONG lReleaseCount,      //倒计数字
	LPLONG lpPreviousCount   //可以为NULL,用来存储修改前的信号量的数量
)
//代码演示

标签:信号量,HANDLE,句柄,win32,互斥,线程,semaphore,BOOL
来源: https://www.cnblogs.com/sqmw/p/16535862.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有