今天,翻開《MFCwindows程式設計》,耐心看完了這一章,所以寫點東西,以備後面使用。
多線程的同步:
1. 臨界區
只能同步同一個進程的線程之間的同步,因為臨界區不能跨越進程的邊界工作。也是因為臨界區沒有name,所以不能跨進程使用。
訪問臨界區之前進行鎖定,訪問後進行解鎖。
如果進程B訪問進程A鎖定的臨界區,那麼進程B會被阻塞,直到線程A釋放臨界區,線程B才可以運行。線上程B進行阻塞期間,不佔用CPU時間.
2. 互斥量
可以同步在相同進程,或不同進程間的線程進行同步。所以互斥量是有name的,可以跨進程使用。
互斥量與臨界區的區別,如果一個線程鎖定了臨界區,而終止時沒有解除臨界區的鎖定,那麼等待臨界區閒置其他線程將無限期的阻塞下去。然而,如果鎖定互斥量的線程不能在其終止前解除互斥量的鎖定,那麼系統將認為互斥量被“放棄”了並自動釋放該互斥量,這樣等待進程就可以繼續執行了。
3. 事件
在任何特定時間,事件只能處在兩種狀態的一種:引發(設定)或者調低(重設)。設定可以任務是出於訊號狀態,重設事件可以認為是出於非訊號狀態。
事件也被描述為“線程觸發器”。事件也不能跨進程。同樣它沒有name。
事件有自動化佈建事件和手動設定事件。其差別是當自動化佈建事件上阻塞的線程被喚醒時,該事件別自動化佈建為訊號狀態。手動設定事件不能自動重設,它必須使用編程的方式重設。
l 如果事件只觸發一個線程,那麼使用自動化佈建事件和使用SetEvent喚醒等待線程。
這裡不需要調用ResetEvent,因為線程被喚醒的那一刻事件將被自動重設。
l 如果事件將觸發兩個或者多個線程,那麼使用手動設定線程和使用PulseEvent喚醒所以的等待線程。而且,您不需要調用ResetEvent,因為PluseEvent在喚醒所有等待線程後為你重設事件。
4. 訊號量
首先,訊號量可以同步不同進程,相同進程中的線程。
其次,訊號量跟其他3種同步機制不同的是,上面3種的同步機制的特性“要沒有,要麼沒有”,訊號量則不同,它始終代表可用資源的數量。鎖定訊號量會減少資源數,釋放訊號量則增加資源數。只有在資源數為0的時候,線程才會被阻塞。
引用:http://blog.csdn.net/renjwjx/article/details/3917407
今天,翻開《MFCwindows程式設計》,耐心看完了這一章,所以寫點東西,以備後面使用。
多線程的同步:
1. 臨界區
只能同步同一個進程的線程之間的同步,因為臨界區不能跨越進程的邊界工作。也是因為臨界區沒有name,所以不能跨進程使用。
訪問臨界區之前進行鎖定,訪問後進行解鎖。
如果進程B訪問進程A鎖定的臨界區,那麼進程B會被阻塞,直到線程A釋放臨界區,線程B才可以運行。線上程B進行阻塞期間,不佔用CPU時間.
2. 互斥量
可以同步在相同進程,或不同進程間的線程進行同步。所以互斥量是有name的,可以跨進程使用。
互斥量與臨界區的區別,如果一個線程鎖定了臨界區,而終止時沒有解除臨界區的鎖定,那麼等待臨界區閒置其他線程將無限期的阻塞下去。然而,如果鎖定互斥量的線程不能在其終止前解除互斥量的鎖定,那麼系統將認為互斥量被“放棄”了並自動釋放該互斥量,這樣等待進程就可以繼續執行了。
3. 事件
在任何特定時間,事件只能處在兩種狀態的一種:引發(設定)或者調低(重設)。設定可以任務是出於訊號狀態,重設事件可以認為是出於非訊號狀態。
事件也被描述為“線程觸發器”。事件也不能跨進程。同樣它沒有name。
事件有自動化佈建事件和手動設定事件。其差別是當自動化佈建事件上阻塞的線程被喚醒時,該事件別自動化佈建為訊號狀態。手動設定事件不能自動重設,它必須使用編程的方式重設。
l 如果事件只觸發一個線程,那麼使用自動化佈建事件和使用SetEvent喚醒等待線程。
這裡不需要調用ResetEvent,因為線程被喚醒的那一刻事件將被自動重設。
l 如果事件將觸發兩個或者多個線程,那麼使用手動設定線程和使用PulseEvent喚醒所以的等待線程。而且,您不需要調用ResetEvent,因為PluseEvent在喚醒所有等待線程後為你重設事件。
4. 訊號量
首先,訊號量可以同步不同進程,相同進程中的線程。
其次,訊號量跟其他3種同步機制不同的是,上面3種的同步機制的特性“要沒有,要麼沒有”,訊號量則不同,它始終代表可用資源的數量。鎖定訊號量會減少資源數,釋放訊號量則增加資源數。只有在資源數為0的時候,線程才會被阻塞。
引用:http://blog.csdn.net/renjwjx/article/details/3917407