首页
社区
课程
招聘
[原创]线程之内核对象与事件操作
2022-2-9 21:39 3329

[原创]线程之内核对象与事件操作

2022-2-9 21:39
3329

1.内核对象:

1
进程、线程、文件、文件映射、事件、互斥体等等       

2、事件内核对象的创建

1
2
3
4
5
6
HANDLE CreateEvent(               
  LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性 NULL时为系统默认               
  BOOL bManualReset,                       // TRUE 通过调ResetEvent将事件对象标记为未通知               
  BOOL bInitialState,                      // TRUE 已通知状态  FALSE未通知状态               
  LPCTSTR lpName                           // 对象名称 以NULL结尾的字符串               
);               

3、事件对象的控制

1
BOOL SetEvent(HANDLE hEvent);                       //将对象设置为已通知

4、事件内核对象的获取//跨进程时使用

1
2
3
4
5
6
7
HANDLE OpenEvent(                       
  DWORD dwDesiredAccess,  // access                       
  BOOL bInheritHandle,    // inheritance option                       
  LPCTSTR lpName          // object name                       
);                       
 
HANDLE g_hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, "XYZ");       

5、内核对象的销毁

1
BOOL CloseHandle(HANDLE hobj);                   

(1)、当没有其他程序引用时,系统会销毁内核对象(使用数量).
(2)、内核对象的生命周期,可能比创建它的对象要长.

6.示例:线程同步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
HANDLE g_hSet, g_hClear;       
int g_Max = 10;       
int g_Number = 0;       
 
//生产者线程函数         
DWORD WINAPI ThreadProduct(LPVOID pM)         
{         
    for (int i = 0; i < g_Max; i++)       
    {         
        WaitForSingleObject(g_hSet, INFINITE);         
        g_Number = 1;
        DWORD id = GetCurrentThreadId();
        printf("生产者%d将数据%d放入缓冲区\n",id, g_Number);
        SetEvent(g_hClear);          
    }         
    return 0;         
}         
//消费者线程函数       
DWORD WINAPI ThreadConsumer(LPVOID pM)         
{         
    for (int i = 0; i < g_Max; i++)       
    {         
        WaitForSingleObject(g_hClear, INFINITE);         
        g_Number = 0;
        DWORD id = GetCurrentThreadId();
        printf("----消费者%d将数据%d放入缓冲区\n",id, g_Number);
        SetEvent(g_hSet);          
    }         
    return 0;         
}         
 
int main(int argc, char* argv[])       
{       
 
    HANDLE hThread[2];        
 
    g_hSet = CreateEvent(NULL, FALSE, TRUE, NULL);     
    g_hClear = CreateEvent(NULL, FALSE, FALSE, NULL);        
 
    hThread[0] = ::CreateThread(NULL, 0, ThreadProduct, NULL, 0, NULL);        
    hThread[1] = ::CreateThread(NULL, 0, ThreadConsumer, NULL, 0, NULL);   
 
    WaitForMultipleObjects(2, hThread, TRUE, INFINITE);         
    CloseHandle(hThread[0]);         
    CloseHandle(hThread[1]);       
 
    //销毁    
    CloseHandle(g_hSet);     
    CloseHandle(g_hClear);         
 
    return 0;   
}       

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回