天天看點

讀《windows核心程式設計》筆記2

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請求完成時調用函數。