-
-
[原创]线程之内核对象与事件操作
-
发表于: 2022-2-9 21:39 4054
-
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 ; } |
赞赏
他的文章
- [原创]win32中通过调用文件资源管理器进行获取文件路径 4562
- [原创]Win32中打印信息 4228
- [原创]线程之内核对象与事件操作 4055
- [原创]常见的几种调用约定 4005
- 硬件断点过CRC(日常笔记分享) 7573
看原图
赞赏
雪币:
留言: