• 线程同步——内核对象实现线程同步——事件内核对象


      1 事件内核对象
      2 
      3 事件类型对象有两种不同类型,手动重置和自动重置
      4 手动重置:当一个手动重置对象被触发时候,等待该对象的所有线程变为可调度。
      5 自动重置:当一个自动重置对象被触发时,只有一个等待该事件的线程会变为可调度
      6 
      7 下面是一个创建事件内核对象的函数:
      8 HANDLE CreateEvent(
      9 LPSECURITY_ATTRIBUTES lpEventAttributes, 
     10 BOOL   bManualReset, 
     11 BOOL   bInitialState,
     12 PCTSTR lpName );
     13 
     14 第一、四个参数和创建其它内核对象相似想必已经十分熟悉了。
     15 这里就不介了哈。
     16 第二个参数bManualReset是一个BOOL值,告诉系统是手动重置对象(TRUE),还是自动重置对象(FALSE).
     17 第三个参数bInitialState是将事件初始化为触发状态(TRUE),还是未触发状态(FALSE)
     18 
     19 BOOL SetEvent(  HANDLE hEvent ) ;
     20 该函数把事件变为触发状态
     21 
     22 BOOL ResetEvent( HANDLE hEvent ) ;
     23 该函数把事件变为未触发状态
     24 
     25 
     26 使用方法:
     27 1 28 //定义一个事件对象1
     29 HANDLE g_hEvent ; 
     30 
     31 2 32 //创建一个手动重置的事件对象,并把事件出事话为触发状态
     33 g_hEvent = CreateEvent(NULL,FALSE,TRUE,NULL);
     34 
     35 3 36 //在线程中调用
     37 DWORD WINAPI ThreadFunOne(PVOID pvParam) 
     38 {
     39 WaitForSingleObject(g_hEvent,INFINITE);
     40 g_x++;
     41 
     42 return 0;
     43 }
     44 
     45 #include "windows.h"
     46 #include "iostream"
     47 using namespace std;
     48 long g_x = 0 ;
     49 
     50 //定义一个事件对象1
     51 HANDLE g_hEvent ;  
     52 
     53 //定义线程函数1
     54 DWORD WINAPI ThreadFunOne(PVOID pvParam) ;
     55 
     56 //定义线程函数2
     57 DWORD WINAPI ThreadFunTwo(PVOID pvParam);
     58 
     59 int main()
     60 {
     61 
     62     //创建一个手动重置的事件对象,并把事件出事话为触发状态
     63     g_hEvent = CreateEvent(NULL,TRUE,TRUE,NULL);
     64 
     65     //把事件设为未触发状态
     66     //    ResetEvent(g_hEvent);
     67 
     68     //把事件设为触发状态
     69     //    SetEvent(g_hEvent) ;
     70 
     71     //创建线程1
     72     HANDLE hThreadOne = CreateThread(NULL,0,ThreadFunOne,0,0,NULL);
     73     CloseHandle(hThreadOne);
     74 
     75     //创建线程2
     76     HANDLE hThreadTwo = CreateThread(NULL,0,ThreadFunTwo,0,0,NULL);
     77     CloseHandle(hThreadTwo);
     78 
     79     //让主线程先挂起,确保其它线程执行完成
     80     Sleep(1000); 
     81     cout<<g_x<<endl;
     82     return 0 ;
     83 }
     84 
     85 DWORD WINAPI ThreadFunOne(PVOID pvParam) 
     86 {
     87     WaitForSingleObject(g_hEvent,INFINITE);
     88     g_x++;
     89 
     90     return 0;
     91 }
     92 
     93 DWORD WINAPI ThreadFunTwo(PVOID pvParam)
     94 {
     95     Sleep(200);
     96     WaitForSingleObject(g_hEvent,INFINITE);
     97     g_x++;    
     98 
     99     return 0;
    100 }

     

  • 相关阅读:
    深入浅出java IO模型
    MySQL 最基本的SQL语法/语句
    mysql sql常用语句大全
    Mysql数据库常用操作语句大全
    python3.6.1 安装PyQt5,以及配置QTDesigner,PyUIC
    Python之文件操作:os模块
    Python之OS模块函数
    Python OS模块
    Shell编程基础
    mysqldump恢复
  • 原文地址:https://www.cnblogs.com/yfyzy/p/3916192.html
Copyright © 2020-2023  润新知