事件的自动重置:两个线层同时访问一个函数,该函数会对全局变量进行操作,用事件进行互斥,假设这个事件初始化有信号   在经过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下的互斥锁,事件以及事件的手动重置和自动重置的区别相关推荐

  1. 用C++ 封装linux下的互斥锁MutexLock和条件变量Condition

    /*封装互斥锁的时候,要用到的方法,20200605*/ //问题一:MutexLock和Condition是否要设计成单例模式? // 单例模式只能通过该类创建出一个对象,这意味着只能创建一把锁,如 ...

  2. FreeRTOS互斥锁

    信号量API函数实际上都是宏,它使用现有的队列机制.这些宏定义在semphr.h文件中.如果使用信号量或者互斥量,需要包含semphr.h头文件. 信号量包括二值信号量.计数信号量.互斥信号量和递归互 ...

  3. 并发编程中常见的锁机制:乐观锁、悲观锁、CAS、自旋锁、互斥锁、读写锁

    文章目录 乐观锁 VS 悲观锁 悲观锁 乐观锁 CAS CAS机制 ABA问题 CAS的优缺点 互斥锁 VS 自旋锁 互斥锁 自旋锁 对比及应用场景 读写锁 实现方式 读写锁 VS 互斥锁 乐观锁 V ...

  4. 自旋锁和互斥锁的区别 java中lock Syntronized区别

    转载自:http://blog.csdn.net/susidian/article/details/51068858 自旋锁(Spin lock) 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠 ...

  5. Go互斥锁(Mutex)

    目录 Mutex 状态 正常模式和饥饿模式 加锁和解锁 小结 Mutex Go 语言的 sync.Mutex 由两个字段 state 和 sema 组成.其中 state 表示当前互斥锁的状态,而 s ...

  6. Go 精妙的互斥锁设计

    Some people, when confronted with a problem, think, "I know, I'll use threads," and then t ...

  7. java 同步锁_java线程中的同步锁和互斥锁有什么区别?

    在java中,同步锁和互斥锁英文关键字都是Synchronized,没有本质上的区别,两者都包括对资源的独占,使用起来没有区别.概念上的区别是 1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,执 ...

  8. C++ 线程同步之互斥锁

    文章目录 1.简介 2.std::mutex 3.线程同步 4.std::lock_guard 5.std::recursive_mutex-少用 6.std::timed_mutex 1.简介 进行 ...

  9. 自旋锁与互斥锁的使用场景分析

    本文不对自旋锁和互斥锁的概念做阐述,重点分析它们之间的区别和自旋锁的使用场景. 自旋锁和互斥锁的区别 a. 互斥锁加锁失败后,线程会释放 CPU,给其他线程:自旋锁加锁失败后,线程会忙等待,直到它拿到 ...

最新文章

  1. 关于跨域策略文件crossdomain.xml文件
  2. python循环语句-python----循环语句及循环控制语句
  3. FFmpeg转码指令(测试通过)
  4. for循环一定要指定键么 vue_第 2 篇:上手 Vue 展示 todo 列表
  5. Apache下如何禁止指定目录运行PHP脚本
  6. 常用输入法隐藏的这些神奇功能
  7. 力扣59.螺旋矩阵II(JavaScript)
  8. python处理照片_有趣的Python图片处理
  9. 101/103/104规约应用典型问题例举
  10. 9月份红帽认证考试又 PASS 19位同学
  11. ps把图片无损放大的方法
  12. 2021-08-04——实践项目1(书本案例)
  13. 解忧云SMS短信服务平台系统 短信发送系统源码 全解密随时可以二开无后门
  14. matlab如何画极零图,用MATLAB画零极点图.ppt
  15. Android小技巧 自动关闭输入法软键盘
  16. 启动时出现 r8169 0000:02:00.0: firmware: agent loaded rtl_nic/rtl8168e-3.fw into memory
  17. php 运行c语言,echo c语言运行
  18. java 九大行星运行_html5 canvas太阳系九大行星运行动态图代码
  19. 专访马云:下一个星辰大海是百货商店
  20. MySQL Galera 集群安装与配置详解

热门文章

  1. vim配置python开发环境_Win10系统下安装编辑器之神(The God of Editor)Vim并且构建Python生态开发环境(2020年最新攻略)...
  2. 三分钟带你了解并使用金万维云备份
  3. flash 消息闪现
  4. 把灵龟八法程序改为了嵌入式芯片
  5. jquery拖动DIV
  6. 美女导师的营销小故事
  7. 关于float的精度类型
  8. 尚观学习-ule-权限
  9. linux 磁盘系统,Linux系统监控之磁盘I/O篇
  10. 如何把jpg图片批量转为mp4视频