幾個知識點:
1.線程需要在下面兩種情況下互相進行通訊:
- 當有多個線程訪問共用資源而不使資源被破壞時;
- 當一個線程需要將某個任務已經完成的情況通知另外一個或多個線程時。
2.線程同步問題在很大程度上與原子訪問有關,所謂原子訪問,是指線程在訪問資源時能夠確保所有其他線程都不在同一時間訪問相同的資源。
3.使用互鎖函數可以保證以原子操作方式進行:InterlockedExchangeAdd(傳遞負值表示減)、InterlockedExchange、InterlockedExchangePointer、InterlockedCompareExchange、InterlockedCompareExchangePointer。
4.使用__declspec(align(32))來調整結構中的位元組對齊。
5.對於需要不斷查詢的共用變數,應該使用volatile關鍵字,它告訴編譯器,變數可以被應用程式本身以外的某個東西進行修改,這些東西包括作業系統、硬體或同時執行的線程等。因而,volatile會告訴編譯器,不要對該變數進行任何最佳化,並且總是重新載入來自該變數的記憶體單元的值。
6.關鍵程式碼片段是指一個小程式碼片段,在代碼能夠執行前,它必須獨佔對某些共用資源的訪問權。EnterCriticalSection和LeaveCriticalSection以及CRITICAL_SECTION結構可以用於完成這項工作。CRITICAL_SECTION結構需要初始化(InitializeCriticalSection),並在進程的線程不再需要訪問共用資源時清除(DeleteCriticalSection)。
7.為了提高關鍵程式碼片段的運行效能,Microsoft將迴圈鎖納入了這些程式碼片段。當EnterCriticalSection函數被調用時,它就使用迴圈所進行迴圈,以便設法多次擷取資源。只有當取得該資源的每次試圖都失敗時,該線程才轉入核心方式,一邊進入等待狀態。通過InitializeCriticalSectionAndSpinCount可以初始化迴圈鎖迭代次數。使用SetCriticalSectionSpinCount可以改變關鍵程式碼片段的迴圈次數。
8.使用關鍵程式碼片段時的一些提示和技巧:
- 每個共用資源使用一個CRITICAL_SECTION變數;
- 同時訪問多個資源時,確保按照完全相同的順序請求對資源的訪問;
- 不要長時間運行關鍵程式碼片段。