016 內核對象的Signal狀態3
阿新 • • 發佈:2017-07-05
互斥 null 句柄 unsigned 所有 tdi 完成 mut 失敗
○ 當hHandle為mutex時,如果擁有mutex的線程在結束時沒有釋放核心對象會引發此返回值。
● WaitForMultipleObjects()等待多個信號狀態
1.等待幾個
2數組
3是否等待所有
4等待時間
○ 返回值WAIT_OBJECT_0 (WAIT_OBJECT_0 + nCount - 1如果bWaitAll為TRUE),則返回值表明所有指定對象的狀態信號。
○ 返回值WAIT_ABANDONED_0 (WAIT_ABANDONED_0 + nCount - 1)如果bWaitAll為TRUE,則返回值表明所有指定對象的狀態是觸發的,並且至少對象之一,是一個廢棄的互斥對象。
○ 返回值WAIT_TIMEOUTT 超時間隔已過
● 同步
○ 進程和進程之間的同步
○ 守護進程 父進程
Signal
● Signal = FALSE 相當於標誌
● 進程 初始化FALSE 運行完成 設置位 TURE
● 線程
● 標準輸入輸出流
● 互斥體
● 信號
● 可等待計時器
● 作業
● WaitForSingleObject() 句柄,時間
○ 當前正在執行的線程,變成不可調度的狀態,
○ 等待Signal 狀態變成 True
○ 返回值 WAIT_TIMEOUT 超時
○ 返回值 WAIT_FAILED 方法失敗 可以使用 GetLastError獲取錯誤
○ 返回值 WAIT_OBJECT_0 指定的對象出有有信號狀態
○ 當hHandle為mutex時,如果擁有mutex的線程在結束時沒有釋放核心對象會引發此返回值。
● WaitForMultipleObjects()等待多個信號狀態
1.等待幾個
2數組
3是否等待所有
4等待時間
○ 返回值WAIT_OBJECT_0 (WAIT_OBJECT_0 + nCount - 1如果bWaitAll為TRUE),則返回值表明所有指定對象的狀態信號。
○ 返回值WAIT_ABANDONED_0 (WAIT_ABANDONED_0 + nCount - 1)如果bWaitAll為TRUE,則返回值表明所有指定對象的狀態是觸發的,並且至少對象之一,是一個廢棄的互斥對象。
○ 返回值WAIT_TIMEOUTT
● 同步
○ 進程和進程之間的同步
○ 守護進程 父進程
1 #define UNICODE 2 #include <stdio.h> 3 #include <Windows.h> 4 #include <process.h> 5 6 unsigned __stdcall ThreadFunc(void *lParam) 7 { 8 return 0; 9 } 10 11 int main() 12 { 13 HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunc, nullptr, 0, nullptr); 14 //WaitForSingleObject(hThread, INFINITE); //永遠等待 ->30天 15 DWORD dw = WaitForSingleObject(hThread, 1000); 16 17 switch(dw) 18 { 19 case WAIT_TIMEOUT: 20 printf("等待超時!\r\n"); 21 break; 22 case WAIT_OBJECT_0: 23 printf("成功等待!\r\n"); 24 break; 25 case WAIT_FAILED: 26 break; 27 } 28 }
WaitForMultipleObjects
1 #define UNICODE 2 #include <stdio.h> 3 #include <Windows.h> 4 #include <process.h> 5 6 unsigned __stdcall ThreadFunc(void *lParam) 7 { 8 Sleep(2000); 9 return 0; 10 } 11 12 int main() 13 { 14 HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunc, nullptr, 0, nullptr); 15 //WaitForSingleObject(hThread, INFINITE); //永遠等待 ->30天 16 DWORD dw = WaitForSingleObject(hThread, 1000); 17 18 switch(dw) 19 { 20 case WAIT_TIMEOUT: 21 printf("等待超時!\r\n"); 22 break; 23 case WAIT_OBJECT_0: 24 printf("成功等待!\r\n"); 25 break; 26 case WAIT_FAILED: 27 break; 28 } 29 }
1 #define UNICODE 2 #include <stdio.h> 3 #include <Windows.h> 4 #include <process.h> 5 6 unsigned __stdcall ThreadFunc(void *lParam) 7 { 8 Sleep((int)lParam); 9 return 0; 10 } 11 12 int main() 13 { 14 HANDLE hThread[2] = {INVALID_HANDLE_VALUE}; 15 hThread[0] = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunc, (void*)100, 0, nullptr); 16 hThread[1] = (HANDLE)_beginthreadex(nullptr, 0, ThreadFunc, (void*)500, 0, nullptr); 17 //WaitForSingleObject(hThread, INFINITE); //永遠等待 ->30天 18 //DWORD dw = WaitForSingleObject(hThread, 1000); 19 //DWORD dw = WaitForMultipleObjects(2,hThread,FALSE,2000); 20 BOOL bLoop = TRUE; 21 DWORD dwRet = -1; 22 while (bLoop) 23 { 24 dwRet = WaitForMultipleObjects(2,hThread,FALSE,100); 25 DWORD dw = WaitForSingleObject(hThread[1],1); 26 if(dw == WAIT_OBJECT_0) 27 { 28 printf("Thread 2 is Reading.........\r\n"); 29 } 30 switch(dwRet) 31 { 32 case WAIT_TIMEOUT: 33 printf("Wait Time Out , Next Check....\r\n"); 34 break; 35 case WAIT_OBJECT_0: 36 printf("Thread 1 is OK..........\r\n"); 37 break; 38 case WAIT_OBJECT_0 +1: 39 printf("Thread 2 is OK........\r\n"); 40 bLoop = FALSE; 41 break; 42 case WAIT_FAILED: 43 printf("Error.........\r\n"); 44 break; 45 } 46 } 47 return 0; 48 /* 49 switch(dw) 50 { 51 case WAIT_TIMEOUT: 52 printf("等待超時!\r\n"); 53 break; 54 case WAIT_OBJECT_0: 55 printf("成功等待!\r\n"); 56 break; 57 case WAIT_FAILED: 58 break; 59 } 60 */ 61 }
016 內核對象的Signal狀態3