1. 程式人生 > >windows執行緒同步機制摘要

windows執行緒同步機制摘要

執行緒之間的同步使用一些核心物件:如thread,  process, evnet, mutex, semaphore. 線上程之間使用等待函式如WaitForSingleObjects,  WaitForMultipleObjects. 等待函式使用核心物件的handle作為引數,如果handle被激發,則執行下一步。 handle被激發的條件: (handle是一段記憶體指標,為了掩藏內部實現而作的一個型別轉化指標) 激發:---我的理解是資源未被戰勝。 未激發: ---資源正在被佔用。 eg: 1)thread, process被終止,則激發。 2)event: 要通過它的API來手動激發,是最靈活的激發方式,可被所有執行緒使用。 3)mutex: 沒被任何執行緒所擁有,則激發。

1)臨界區: CRITICAL_SECTION 適用範圍: 單一程序的各執行緒之間用來排它性佔有 特性: 區域性性物件; 快速而有效. 無法監測是否被執行緒放棄 函式: EnterCriticalSection LeaveCriticalSection

2)Mutex: 適用範圍: 不同執行緒之間用來排它性佔有 特性: 核心物件, 可以使用wait進行等待,只能被擁有執行緒所釋放 函式:CreateMutex ReleaseMutex

3)semaphore: 訊號量 適用範圍: 用來限制資源佔用 特性: 核心物件,沒有擁有者,任何執行緒都可釋放 函式:CreateSemaphore OpenSemaphore ReleaseSemaphore

4)Event: 適用範圍: 同來控制物件訊號的接收,常與訊號系統結合起來 特性: 核心物件 函式: CreateEvent OpenEvent PulseEvent SetEvent ResetEvent   5)Interlocked 簡單的原子操作,如寫檔案中對檔案中位元組範圍的鎖定_locking

NOTE: 執行緒同步中很重要的可歸納為鎖系統lock和訊號系統signal lock包括:CRITICAL_SECTION, Mutex, wait function: WaitForMultipleObjects WaitForSingleObject  Sleep   6)completion port 適用範圍: 網路非同步接收,包括檔案讀寫 特性:由OS來控制讀寫, 是windows平臺最有效的同步機制,相當於linux的AIO或者非阻塞socket+epoll 函式: CreateIoCompletionPort GetQueuedCompletionStatus

示例1: event //事件機制: 設定一個全域性event物件,這個只能等待最多64個物件,而且要用WaitForMultipleObjects來監視線

程handle陣列. 不如完全埠completion port HANDLE ghWriteEvent; HANDLE ghThreads[THREADCOUNT]; //(1)建立個手動事件,一開始不接受任何訊號no signel //ResetEvent: 用來訊號重置,同CreateEvent or OpenEvent   ghWriteEvent = CreateEvent(         NULL,               // default security attributes         TRUE,               // manual-reset event         FALSE,              // initial state is nonsignaled         TEXT("WriteEvent")  // object name         ); //(2)產生一堆執行緒,設定事件響應訊號signal,     if (! SetEvent(ghWriteEvent) )     {         printf("SetEvent failed (%d)/n", GetLastError());         return;     } //(3)設定執行緒等待事件,所有執行緒都接到這個事件,,這裡對執行緒進行了同步,只有所有執行緒都執行了,才執行下一步     dwWaitResult = WaitForMultipleObjects(         THREADCOUNT,   // number of handles in array         ghThreads,     // array of thread handles         TRUE,          // wait until all are signaled         INFINITE); { //(3.1)其中每個執行緒函式都在等待事件物件,這裡也對執行緒進行了同步,只有得到signal的執行緒才執行下一步  dwWaitResult = WaitForSingleObject(           ghWriteEvent, // event handle           INFINITE);    // indefinite wait

} //(4)關閉了這個全域性事件 == CloseHandle(ghWriteEvent)  CloseEvents();

示例2: completion port  (1) 建立完成埠, 與一個監聽socket發生關聯 CreateIoCompletionPort  (2) 產生一堆執行緒,讓執行緒在完全埠迴圈等待. CreateThread--(WorkerThread)--

GetQueuedCompletionStatus  (3) 接收監聽socket的讀寫請求accept,將accept socket與完全埠關聯,....?