线程同步(windows平台):事件

一:介绍

事件Event实际上是个内核对象,事件分两种状态:激发状态和未激发状态。分两种类型:手动处置事件和自动处置事件。
手动处置事件被设置为激发状态后,会唤醒所有等待的线程,一直保持为激发状态,直到把它设置为未激发状态。
自动处置事件被设置为激发状态后,会唤醒一个等待中的线程,然后会自动设置成未激发状态。

二:函数说明

创建事件对象:
    HANDLE CreateEvent
    (
      LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性
      BOOL bManualReset,     // 指定将事件对象创建成手动复原还是自动复原,true:手动事件;false:自动事件
      BOOL bInitialState, // 初始状态,true:有信号状态; false:无信号状态
      LPCTSTR lpName         // 事件对象名称
    );

获得事件对象:
    DWORD WaitForSingleObject( 
            HANDLE hHandle,        //事件对象的句柄 
            DWORD dwMilliseconds    //0:测试对象的状态立即返回;INFINITE:对象被触发信号后,函数才会返回
    }

触发事件:
    BOOL SetEvent(HANDLEhEvent)
    
将事件设置成未触发:
    BOOL ResetEvent(HANDLEhEvent);

三:步骤

自动处置事件步骤:
1.声明事件对象:Handle hEvent
2.创建事件对象:CreateEvent(NULL, FALSE, TRUE, NULL)
3.使用事件对象:WaitForSingleObject(hEvent, INFINITE)
4.重置事件对象:SetEvent(hEvent)
5.销毁事件对象:CloseHandle(hEvent)

手动处置事件步骤:
1.声明事件对象:Handle hEvent
2.创建事件对象:CreateEvent(NULL, TRUE, TRUE, NULL)
3.使用事件对象:WaitForSingleObject(hEvent, INFINITE)
4.重置为未激活:ResetEvent(hEvent)
5.重置为激活态:SetEvent(hEvent)
5.销毁事件对象:CloseHandle(hEvent)

四:自动处置事件代码实现

 1 /********************************************************
 2 Copyright (C),  2016-2018,
 3 FileName:        t13
 4 Author:            woniu201
 5 Email:             [email protected]
 6 Created:           2018/10/23
 7 Description:    线程同步-事件
 8 ********************************************************/
 9 #include <iostream>
10 #include <Windows.h>
11
12 using namespace std;
13
14 volatile int number = 1;
15 HANDLE hEvent;
16
17 DWORD CALLBACK ThreadFun1(LPVOID pParam)
18 {
19     while (1)
20     {
21         WaitForSingleObject(hEvent, INFINITE);
22         cout << "Thread1:" << number++ << endl;
23         SetEvent(hEvent);
24         if (number >= 1000)
25         {
26             break;
27         }
28
29     }
30     return 0;
31 }
32
33 DWORD CALLBACK ThreadFun2(LPVOID pParam)
34 {
35     while (1)
36     {
37         WaitForSingleObject(hEvent, INFINITE);
38         cout << "Thread2:" << number++ << endl;
39         SetEvent(hEvent);
40         if (number >= 1000)
41         {
42             break;
43         }
44     }
45     return 0;
46 }
47
48
49 int main()
50 {
51     //创建自动事件
52     hEvent = CreateEvent(NULL, false, true, NULL);
53
54     CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL);
55     CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL);
56
57     getchar();
58     return 1;
59 }

原文地址:https://www.cnblogs.com/woniu201/p/9842805.html

时间: 2024-11-04 05:50:31

线程同步(windows平台):事件的相关文章

线程同步(windows平台):信号量

一:介绍 信号量也是系统核心对象,它允许多个线程同一时刻访问同一资源,但需限制同一时刻访问资源的最大线程数目. 信号量遵循规则:1.当前资源计数大于0,信号量有效.2.当前资源计数等于0,信号量无效.3.系统不允许当前资源数量为负.4.当前资源数量不能大于最大资源数量. 二:函数说明 创建信号量:    HANDLE   CreateSemaphore(         LPSECURITY ATTRIBUTES   lpSemaphoreAttributes,     //安全属性      

线程同步(windows平台):互斥对象

一:介绍 互斥对象是系统内核维护的一种数据结构,保证了对象对单个线程的访问权. 二:函数说明 创建互斥对象:    HANDLE CreateMutex(            LPSECURITY_ATTRIBUTES lpMutexAttributes, 安全属性结构指针,可为NULL,表示默认安全性            BOOL bInitialOwner,     //是否占有该互斥量,TRUE:占有,FALSE:不占有            LPCTSTR lpName       

进程、线程同步互斥学习 —— 事件

关于事件,先看MSDN介绍: Event Objects Anevent object is a synchronization object whose state can be explicitly set to signaled by use of theSetEvent function. 即:Event与其他线程同步不同,Event可以通过函数来设置有无信号量. 初始化 A thread uses theCreateEvent or CreateEventEx function to

C++线程同步 -- windows

简介: 在一般情况下,创建一个线程是不能提高程序的执行效率的,所以要创建多个线程.但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对同一个内存地址进行写入, 由于CPU时间调度上的问题,写入数据会被多次的覆盖,所以就要使线程同步. 同步就是协同步调,按预定的先后次序进行运行.如:你说完,我再说. “同”字从字面上容易理解为一起动作 , 其实不是,“同”字应是指协同.协助.互相配合. 如进程.线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示

C#线程同步手动重置事件——ManualResetEvent

和AutoResetEvent类的区别是,Manual一旦set后不会自动reset,会放行所有waitone的线程,而autoresetevent每一次set之后只会放行一个waitone的线程,然后立即自动reset.这就是自动和手动的区别,实际上说的是自动reset和手动reset. 这里就贴一段翻译注释的msdn官方代码吧. using System; using System.Collections.Generic; using System.Linq; using System.Te

Windows线程同步总结

Windows线程同步 Windows的线程同步可以利用互斥对象来实现,也可以使用事件对象,关键代码段来实现. 1 事件对象实现线程同步 <1>Event对象创建函数 事件对象的创建事件对象属于内核对象,它包含以三个成员:使用计数,是否是自动重置还是人工重置的布尔值,通知状态的布尔值. HANDLE CreateEvent( LPSECURITY_ATTRIBUTESlpEventAttributes, BOOLbManualReset, BOOLbInitialState, LPCSTRlp

Visual C++线程同步技术剖析:临界区,事件,信号量,互斥量

转自: 使线程同步 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解.正常情况下对这种处理结果的了解应当在其处理任务完成后进行. 如果不采取适当的措施,其他线程往往会在线程处理任务结束前就去访问处理结果,这就很有可能得到有关处理结果的错误了解.例如,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题.如果一个线程负责改变此变量的值,而其他线程负责同时读取变量内容,则不能保证读取到的数

Delphi中线程类TThread实现多线程编程(线程同步技术、Synchronize、WaitFor……)

接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event)与Delphi中的事件有所不同.从本质上讲,Event其实就相当于一个全局的布尔变量.它有两个赋值操作:Set和ReSet,相当于把它设置为 True或False.而检查它的值是通过WaitFor操作进行.对应在Windows平台上,是三个API函数:SetEvent.ResetEvent.WaitForSignalObje

Win32 - 线程同步

线程的同步可分用户模式的线程同步和内核对象的线程同步两大类. 用户模式中线程的同步方法主要有原子访问和临界区等方法.其特点是同步速度特别快,适合于对线程运行速度有严格要求的场合. 内核对象的线程同步则主要由事件.等待定时器.信号量以及信号灯等内核对象构成.由于这种同步机制使用了内核对象,使用时必须将线程从用户模式切换到内核模式,而这种转换一般要耗费近千个CPU周期,因此同步速度较慢,但在适用性上却要远优于用户模式的线程同步方式. 在WIN32中,同步机制主要有以下几种: (1)事件(Event)