8 使用者模式下線程的同步,一些函數而已。
1 InterlockedExchange InterlockedExchangeAdd InterlockedExchangePointer InterlockedCompareExchange……………………
2. 高速緩存行:_ _ d e c l s p e c ( a l i g n ( 3 2 ) )。最好是始終都讓單個線程來通路資料(函數參數和局部變量是確定做到這一點的最好方法),或者始終讓單個C P U通路這些資料(使用線程親緣性)。如果采取其中的一種方法,就能夠完全避免高速緩存行的各種問題。
3.進階線程同步 1.關鍵代碼段 EnterCriticalSection DeleteCriticalSection | InitializeCriticalSection | LeaveCriticalSection TryEnterCriticalSection
4 InitializeSRWLock ReleaseSRWLockShared AcquireSRWLockShared 條件變量:SleepConditionVareableSRW SleepConditionVariableCS
9 線程與核心對象的同步
1 下面的核心對象可以處于已觸發狀态或未觸發狀态:■程序(終止是被觸發)■ 檔案修改通知■ 線程■ 事件■ 作業■ 可等待定時器■檔案■ 信标■ 控制台輸入■ 互斥對象,當核心對象觸發時,可以使WaitFor系列函數傳回。
2.Wa i t F o r S i n g l e O b j e c t。使用Wa i t F o r M u l t i p l e O b j e c t s函數兩種方法:一種方式是讓線程進入等待狀态,直到指定核心對象中的任何一個變為已觸發狀态。另一種方式是讓線程進入等待狀态,直到所有指定的核心對象都變為已觸發狀态。
3 成功等待的副作用:例如,有一個線程正在等待自動清除事件對象(本章後面将要介紹)。當事件對象變為已觸發狀态時,函數就會發現這個情況,并将WA I T _ O B J E C T _ 0傳回給調用線程。但是就在函數傳回之前,該事件将被置為未觸發狀态,這就是成功等待的副作用。
4 事件核心對象 CreateEvent 可等待的定時器核心對象CreateWaitableTimer.等待定時器對象總是在未觸發狀态中建立。必須調用S e t Wa i t a b l e Ti m e r函數來告訴定時器你想在何時讓它成為已觸發狀态.。M i c r o s o f t還允許定時器給在定時器得到通知信号時調用S e t Wa i t a b l e Ti m e r函數的線程的異步過程調用(A P C)進行排隊。
5 信号量核心對象 通過調用R e l e a s e S e m a p h o r e函數,線程就能夠對信标的目前資源數量進行遞增.信号量的使用規則如下:
• 如果目前資源的數量大于0,則發出信标信号。
• 如果目前資源數量是0,則不發出信标信号。
• 系統決不允許目前資源的數量為負值。
• 目前資源數量決不能大于最大資源數量。
6 互斥對象核心對象 互斥對象(m u t e x)核心對象能夠確定線程擁有對單個資源的互斥通路權。互斥對象包含一個使用數量,一個線程I D和一個遞歸計數器,I D用于辨別系統中的哪個線程目前擁有互斥對象。互斥對象的使用規則如下:
• 如果線程I D是0(這是個無效I D),互斥對象不被任何線程所擁有,并且發出該互斥對象的觸發信号。
• 如果I D是個非0數字,那麼一個線程就擁有互斥對象,并且不發出該互斥對象的觸發信号。
• 與所有其他核心對象不同, 互斥對象在作業系統中擁有特殊的代碼,允許它們違反正常的規則(後面将要介紹這個異常情況)。
7 線程同步對象速查表
對象 何時處于未通知狀态 何時處于已通知狀态 成功等待的副作用 程序 當程序仍然活動時 當程序終止運作時(ExitProcess,TerminateProcess) 無 線程 當線程仍然活動時 當線程終止運作時(ExitThread,TerminateThread) 無 作業 當作業的時間尚未結束時 當作業的時間已經結束時 無 檔案 當I / O請求正在處理時 當I / O請求處理完畢時 無 控制台輸入 不存在任何輸入 當存在輸入時 無 檔案修改通知 沒有任何檔案被修改 當檔案系統發現修改時 重置通知 自動重置事件 ResetEvent,Pulse-Event或等待成功 當調用SetEvent/Puls Event時 重置事件 人工重置事件 ResetEvent或PulseEvent 當調用SetEvent/PulseEvent時 無 自動重置等待定時器 CancelWaitableTimer或等待成功 當時間到時(SetWaitableTime r) 重置定時器 人工重置等待定時器 CancelWaitableTimer 當時間到時(SetWaitableTimer) 無 信标 等待成功 當數量> 0時(ReleaseSe maphore) 數量遞減1 互斥對象 等待成功 當未被線程擁有時(R e l e a s e互斥對象) 将所有權賦予線程 關鍵代碼段(使用者方式) 等待成功((Try)EnterCr iticalSection) 當未被線程擁有時(LeaveCriticalSection) 将所有權賦予線程
10 同步裝置I/O與異步裝置I/O
1 同步會阻塞線程。2 異步readfile io不會,核心會啟動一個新的線程來處理IO。當然處理完成後需要通知原來的線程。
2 用來接收IO完成通知的方法 一,觸發裝置核心對象 二,觸發事件核心對象 三,使用可提醒IO 四,使用IO完成端口
11,線程池的使用
新的線程池函數使你能夠執行下列操作:
• 異步調用函數。
• 按照規定的時間間隔調用函數。
• 當單個核心對象變為已觸發狀态時調用函數。
• 當異步I / O請求完成時調用函數。