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