- 首先,用互鎖函數家族的時候,這些函數只能用在單值數據上
- 如果用關鍵代碼段的話,只能對單個進程中的線程進行同步。而且容易出現死瑣,而且不能設置等待時間
· Processes
|
· File change notifications
|
· Threads
|
· Events
|
· Jobs
|
· Waitable timers
|
· Files
|
· Semaphores
|
· Console input
|
· Mutexes
|
- 第1個參數就是要等待的對象的HANDLE,可以是上面四個中的一個。
- 第2個參數是等待超時時間。
- WAIT_OBJECT_0//成功等待。也就是內核對象已經爲signaled,線程成爲可調度線程
- WAIT_TIMEOUT//因爲超時,線程重新喚醒,成爲可調度的
- WAIT_FAILED//將一個錯誤的值傳遞給WaitForSingleObject,比如傳遞了一個無效句柄。
- dwCount //想要讓函數查看的內核對象的數目,這個值必須在1到MAXIMUN_WAIT_OBJECTS(64)
- phObjects //指向內核對象句柄的數組的指針
- fWaitAll //如果爲TRUE,就是等待到所有內核對象都signaled。FALSE則是只要有一個signaled就喚醒
- dwMillisecounds //超時時間
const LARGE_INTEGER *pDueTime, // when timer will become signaled
LONG lPeriod, // periodic timer interval
PTIMERAPCROUTINE pfnCompletionRoutine, // pointer to the completion routine
LPVOID lpArgToCompletionRoutine, // data passed to the completion routine
BOOL fResume // flag for resume state
);
- *pDueTime是等待定時器第1次報時的時間。可以爲這個參數傳遞0,表示調用函數的時候就報時。或者傳遞一個負值,表示調用這個函數開始延遲n*100ns後開始第1次報時。
- pfnCompletionRoutine指向一個函數的地址。如果這項不爲NULL,那麼當定時器報時的時候,會講這個函數放入線程的APC隊列。(什麼是APC會在以後詳細介紹)
- 使用計數器
- 擁有Mutex的線程ID
- 遞歸計數器//該線程擁有互斥對象的次數
- 線程ID爲0,互斥對象不被任何線程所擁有,並且發出該互斥對象的通知信號
- 線程ID不爲0,那麼線程就擁有該互斥對象,不發出通知信號
Characteristic
|
Mutex
|
Critical Section
|
Performance
|
Slow
|
Fast
|
Can be used across process boundaries
|
Yes
|
No
|
Declaration
|
HANDLE hmtx;
|
CRITICAL_SECTION cs;
|
Initialization
|
hmtx= CreateMutex (NULL, FALSE, NULL);
|
InitializeCriticalSection(&cs);
|
Cleanup
|
CloseHandle(hmtx);
|
DeleteCriticalSection(&cs);
|
Infinite wait
|
WaitForSingleObject (hmtx, INFINITE);
|
EnterCriticalSection(&cs);
|
0 wait
|
WaitForSingleObject (hmtx, 0);
|
TryEnterCriticalSection(&cs);
|
Arbitrary wait
|
WaitForSingleObject (hmtx, dwMilliseconds);
|
Not possible
|
Release
|
ReleaseMutex(hmtx);
|
LeaveCriticalSection(&cs);
|
Can be waited on with other kernel objects
|
Yes (use WaitForMultipleObjects or similar function)
|
No
|