多執行緒之知識點

2021-07-03 12:37:36 字數 1363 閱讀 4837

多執行緒的學習:

1.++  --都不是原子操作,在多執行緒中值可能被改變

因此在多執行緒環境中對乙個變數進行讀寫時,我們需要有一種方法能夠保證對乙個值的遞增操作是原子操作——即不可打斷性,乙個執行緒在執行原子操作時,其它執行緒必須等待它完成之後才能開始執行該原子操作。這種涉及到硬體的操作會不會很複雜了,幸運的是,windows系統為我們提供了一些以interlocked開頭的函式來完成這一任務(下文將這些函式稱為interlocked系列函式)。

下面列出一些常用的interlocked系列函式:

1.增減操作

long__cdeclinterlockedincrement(long volatile* addend);

long__cdeclinterlockeddecrement(long volatile* addend);

返回變數執行增減操作之後的值。

long__cdec interlockedexchangeadd(long volatile* addend, longvalue);

返回運算後的值,注意!加個負數就是減。

2.賦值操作

long__cdeclinterlockedexchange(long volatile* target, longvalue);

value就是新值,函式會返回原先的值。

2、關鍵段

1.關鍵段共初始化化、銷毀、進入和離開關鍵區域四個函式。 2

.關鍵段可以解決執行緒的互斥問題,但因為具有「執行緒所有權」,所以無法解決同步問題。

這個問題可以參見  部落格 3

.推薦關鍵段與旋轉鎖配合使用。

3、在經典多執行緒問題中設定乙個事件和乙個關鍵段。用事件處理主線程與子執行緒的同步,用關鍵段來處理各子執行緒間的互斥

4、事件物件

1.事件是核心物件,事件分為手動置位事件和自動置位事件。事件event內部它包含乙個使用計數(所有核心物件都有),乙個布林值表示是手動置位事件還是自動置位事件,另乙個布林值用來表示事件有無觸發。

(1).對於手動置位事件,所有正處於等待狀態下執行緒都變成可排程狀態。

(2).對於自動置位事件,所有正處於等待狀態下執行緒只有乙個變成可排程狀態。

2.事件可以由setevent()來觸發,由resetevent()來設成未觸發。還可以由pulseevent()來發出乙個事件脈衝。

3.事件可以解決執行緒間同步問題,因此也能解決互斥問題。

5、互斥量

1.互斥量是核心物件,它與關鍵段都有「執行緒所有權」所以不能用於執行緒的同步。

2.互斥量能夠用於多個程序之間執行緒互斥問題,並且能完美的解決某程序意外終止所造成的「遺棄」問題。

6、訊號量

1. 訊號量是核心物件

2. 訊號量也可以解決執行緒之間的同步問題

多執行緒知識點總結

多執行緒的問題主要圍繞3個問題處理 1.原子性,2.可見性,3.有序性 1.原子性,不可被其他執行緒打斷的操作。如read.write sychronized 2.可見性 一條執行緒修改了某值,新值對其他執行緒立即可知 普通變數是通過主記憶體完成多執行緒的共享,因此在多執行緒的情況下,很多髒資料。v...

多執行緒 知識點集合

執行緒常用方法 new 新建狀態 runnable 執行 可執行 狀態 blocked 阻塞狀態 timed waiting 休眠狀態 waiting 等待狀態 terminated 終止狀態 threadstate類 public class threadstate implements runn...

多執行緒 知識點總結二

1.sleep 和wait 方法的區別?sleep 必須指時間 不釋放鎖。wait 可以不指定時間,也可以指定時間 釋放鎖。2.為什麼wait notify notifyall 等方法都定義在object類中?wait 等待,notify 喚醒單個執行緒,notifyall 喚醒所有的執行緒 這些方...