1. 程式人生 > >016 內核對象的Signal狀態3

016 內核對象的Signal狀態3

互斥 null 句柄 unsigned 所有 tdi 完成 mut 失敗

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