美文网首页从汇编到C++
事件和线程同步

事件和线程同步

作者: Asura_Luo | 来源:发表于2018-05-04 02:35 被阅读0次

事件和线程同步

函数

//创建一个时间对象

HANDLE CreateEvent(
  LPSECURITY_ATTRIBUTES lpEventAttributes, // SD 安全属性
  BOOL bManualReset,                       // reset type 0自动复位(互斥)、1手动复位(通知模式)
  BOOL bInitialState,                      // initial state 初始创建时时间是否具备信号
  LPCTSTR lpName                           // object name 对象的名称
);

//将目标事件对象设置为有信号的(同时通知其他线程)
BOOL SetEvent(  
    HANDLE hEvent   // handle to event //目标事件的句柄
);
//将目标事件对象设置为无信号的
BOOL ResetEvent(  
    HANDLE hEvent   // handle to event 目标事件的句柄
);

通知模式

回顾互斥模式

image

在线程间共享资源的时候,它们间的状态是互相排斥的,当A拿到所有权使用共享资源的时候,B线程是被排斥的,只有当A交出所有权的时候B才能够使用

中有个属性 标识符 比如说标识符为1的时候代表无人使用(有信号的),这个时候A和B回去抢夺锁,使用WaitForSingleObject来检测标识符,先到先得,比如线程A先到获得了信号,A就会获取信号回去所有权,此时锁会自动设置为0 代表无信号,此时A获得了临界区,可以访问共享资源,此时即使发生线程切换,也可保证共享资源的完整。当A使用完毕后,使用ReleaseMutex归还所有权,那么此时互斥锁状态改为1 有信号 回归无人使用。其他线程继续抢夺

通知模式

image

通知模式,A 或者B线程的WaitForSingleObject检测信号,当使用SetEventAPI发出信号的时候,与互斥模式不同,通知模式检测到 标识为 1的的时候 WaitForSingleObject 会立即返回往下执行,但不会修改信号标识,发生线程切换后,其他线程也可以检测到1 继续执行 同样不会修改。此时就像通知一样,其他的线程都可以往下继续执行了。

线程同步

  • 线程的互斥
    当某个共享资源被多个线程共同访问的时候,在同一时间只能有一个线程在访问我们的资源

  • 线程的同步
    线程的同步建立在线程互斥的基础上
    多个线程访问同一个资源的时候在互斥的基础上还有有序

例如:AB同时访问一个资源的时候,要求AB轮流有序的访问,而不是处于一种先到先得的抢夺状态

同步 = 互斥 + 有序

相关文章

  • 事件和线程同步

    事件和线程同步 函数 通知模式 回顾互斥模式 在线程间共享资源的时候,它们间的状态是互相排斥的,当A拿到所有权使用...

  • 线程同步--事件

    HANDLE hEvent; 使用前先创建事件: hEvent = CreateEvent(NULL, //安全...

  • I/O模型与多路复用

    同步、异步、阻塞、非阻塞 同步 & 异步 同步与异步是针对多个事件(线程/进程)来说的。 如果事件A需要等待事件B...

  • 从Event Loop谈JS的运行机制 - 2023-02-15

    JS分为同步任务和异步任务 同步任务都在主线程上执行,形成一个执行栈 主线程之外,事件触发线程管理着一个任务队列,...

  • 组合式异步编程

    构造同步和异步操作 合并两个独立线程的任务 响应事件

  • Parser 中GCD的使用(5)

    PFEventuallyQueue 事件队列PFPinningEventuallyQueue 只是 同步线程,进行...

  • Promise 解析和事件循环机制

    js单线程(线程中拥有唯一的一个事件循环) js分为同步任务和异步任务,同步任务都是在主线程上执行。当一个任务执行...

  • OC多线程的几个概念

    同步与异步 同步: 当前线程运行中,加入某件事件的处理,当前线程要等待这件事件完成后再继续运行(当前线程需要等待,...

  • 05. 多线程之事件(Event类)

    python线程的事件用于主线程控制其他线程的执行,事件是一个简单的线程同步对象,其主要提供以下几个方法: cle...

  • VC 线程同步(事件)

    1.创建事件 2.打开事件 3.重置和触发事件 4.等待内核对象函数 5.下面一个例子来展示下怎么用事件来实现线程...

网友评论

    本文标题:事件和线程同步

    本文链接:https://www.haomeiwen.com/subject/hgyrrftx.html