Windwos下的互斥锁,事件以及事件的手动重置和自动重置的区别
事件的自动重置:两个线层同时访问一个函数,该函数会对全局变量进行操作,用事件进行互斥,假设这个事件初始化有信号 在经过WAITFORSIGALOBJECT()后事件就会变为没有信号,另外一个线程无法进去,第一个线程操作完需设置为有信号 setEvent(events);使事件变成有信号后,第二个线程才能进入。
事件的手动重置:相当于一个用户(线层)经过WaitForSingleObject()之后 不会使事件变为无信号,所有线层都可以进去,需要ResetEvent()使事件没有信号,下面例子使用手动重置没有意义。
互斥锁Mutex:第一个线程进入原子操作后(也就是经过waitforsingleobject()函数后) 自动锁上 然后需要ReleaseMutex(mutex);第二个线程才能进去 事件相对互斥锁可以更加细腻的控制线程
#include "iostream"
#include "windows.h"
using namespace std;
int g_iticket = 100;
unsigned long _stdcall bar(void*pramater);
//HANDLE Mutex = nullptr; //互斥锁
HANDLE hevent = nullptr;
int main(void)
{
int inum1 = 1;
int inum2 = 2;
HANDLE thread1 = CreateThread(nullptr/*安全描述符*/, 0/*建立的线程空间的大小-默认大小*/, bar/*线程函数*/, &inum1, 0/*马上开始运行*/, nullptr/"线程的名字"/);
HANDLE thread2 = CreateThread(nullptr, 0, bar, &inum2, 0, nullptr);
//HANDLE Mutex = CreateMutex(nullptr/*安全默认权限*/, false/*创建者是否为锁的拥有者*/, nullptr/*名字*/);
hevent = CreateEvent(nullptr, false/*是否手动重置*/, true/*有没有信号,有信号才能进门*/
, nullptr);//手动重置在waiforobjecket()后不会关门需要在后面加reset(event)
// hevent = CreateEvent(nullptr, false, false, nullptr);//否手动重置,初始无信号,匿名
// SetEvent(hevent); //由于初始没信号 给他一个信号
// hevent = CreateEvent(nullptr, true, true, nullptr);//是 手动重置,初始没有信号,匿名
if (thread1)
{
CloseHandle(thread1);
}
if (thread1)
{
CloseHandle(thread2);
}
Sleep(8000);
CloseHandle(hevent);
return 0;
}
unsigned long _stdcall bar(void*pramater)
{
int* inum = reinterpret_cast<int *>(pramater);
while (true)
{
WaitForSingleObject(Mutex ,INFINITE)
WaitForSingleObject(hevent, INFINITE);//等待一个人线程得到锁,得到后另一个线程阻塞在这里 进去过后就没信号
//ResetEvent(hevent);用于手动重置 //自动重置的话需要加:票0回出现~~ 应为设为自动重置的话用户经过waitforSigleObject()不会置事件无信号,所有线层都可进去
if (g_iticket > 0)
{
Sleep(50);
cout << "#" <<*inum<<":" <<g_iticket-- << endl;
//ReleaseMutex(Mutex);//第一个线程执行完过后释放这个锁好让第二个线程进入
SetEvent(hevent);
}
else
{
//ReleaseMutex(Mutex);
SetEvent(hevent);
break;
}
}
return 0;
}
Windwos下的互斥锁,事件以及事件的手动重置和自动重置的区别相关推荐
- 用C++ 封装linux下的互斥锁MutexLock和条件变量Condition
/*封装互斥锁的时候,要用到的方法,20200605*/ //问题一:MutexLock和Condition是否要设计成单例模式? // 单例模式只能通过该类创建出一个对象,这意味着只能创建一把锁,如 ...
- FreeRTOS互斥锁
信号量API函数实际上都是宏,它使用现有的队列机制.这些宏定义在semphr.h文件中.如果使用信号量或者互斥量,需要包含semphr.h头文件. 信号量包括二值信号量.计数信号量.互斥信号量和递归互 ...
- 并发编程中常见的锁机制:乐观锁、悲观锁、CAS、自旋锁、互斥锁、读写锁
文章目录 乐观锁 VS 悲观锁 悲观锁 乐观锁 CAS CAS机制 ABA问题 CAS的优缺点 互斥锁 VS 自旋锁 互斥锁 自旋锁 对比及应用场景 读写锁 实现方式 读写锁 VS 互斥锁 乐观锁 V ...
- 自旋锁和互斥锁的区别 java中lock Syntronized区别
转载自:http://blog.csdn.net/susidian/article/details/51068858 自旋锁(Spin lock) 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠 ...
- Go互斥锁(Mutex)
目录 Mutex 状态 正常模式和饥饿模式 加锁和解锁 小结 Mutex Go 语言的 sync.Mutex 由两个字段 state 和 sema 组成.其中 state 表示当前互斥锁的状态,而 s ...
- Go 精妙的互斥锁设计
Some people, when confronted with a problem, think, "I know, I'll use threads," and then t ...
- java 同步锁_java线程中的同步锁和互斥锁有什么区别?
在java中,同步锁和互斥锁英文关键字都是Synchronized,没有本质上的区别,两者都包括对资源的独占,使用起来没有区别.概念上的区别是 1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,执 ...
- C++ 线程同步之互斥锁
文章目录 1.简介 2.std::mutex 3.线程同步 4.std::lock_guard 5.std::recursive_mutex-少用 6.std::timed_mutex 1.简介 进行 ...
- 自旋锁与互斥锁的使用场景分析
本文不对自旋锁和互斥锁的概念做阐述,重点分析它们之间的区别和自旋锁的使用场景. 自旋锁和互斥锁的区别 a. 互斥锁加锁失败后,线程会释放 CPU,给其他线程:自旋锁加锁失败后,线程会忙等待,直到它拿到 ...
最新文章
- 关于跨域策略文件crossdomain.xml文件
- python循环语句-python----循环语句及循环控制语句
- FFmpeg转码指令(测试通过)
- for循环一定要指定键么 vue_第 2 篇:上手 Vue 展示 todo 列表
- Apache下如何禁止指定目录运行PHP脚本
- 常用输入法隐藏的这些神奇功能
- 力扣59.螺旋矩阵II(JavaScript)
- python处理照片_有趣的Python图片处理
- 101/103/104规约应用典型问题例举
- 9月份红帽认证考试又 PASS 19位同学
- ps把图片无损放大的方法
- 2021-08-04——实践项目1(书本案例)
- 解忧云SMS短信服务平台系统 短信发送系统源码 全解密随时可以二开无后门
- matlab如何画极零图,用MATLAB画零极点图.ppt
- Android小技巧 自动关闭输入法软键盘
- 启动时出现 r8169 0000:02:00.0: firmware: agent loaded rtl_nic/rtl8168e-3.fw into memory
- php 运行c语言,echo c语言运行
- java 九大行星运行_html5 canvas太阳系九大行星运行动态图代码
- 专访马云:下一个星辰大海是百货商店
- MySQL Galera 集群安装与配置详解