多執行緒程式設計學習筆記 執行緒同步(二)

2022-02-09 07:43:28 字數 3446 閱讀 5763

1. 使用autoresetevent類來實現從乙個執行緒向另乙個執行緒發出通知。

2.**如下

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using system.threading; //

引入執行緒

using

system.diagnostics;

namespace

threadsynchronousdemo

static

void working(string name,int

seconds)

開始執行工作

", name);

thread.sleep(timespan.fromseconds(seconds));

console.writeline(

" 正在工作。。。。。。",

name);

//發訊號,說明值已經被寫進去了。這裡的意思是說set是乙個發訊號的方法。

autoresetwork.set();

console.writeline(

"等待主線程完成工作,並發出訊號");

autoresetmain.waitone();

console.writeline(

"主線程發來訊號,開始第二次工作");

thread.sleep(timespan.fromseconds(seconds));

console.writeline(

" 第二次工作正在進行中。。。。。

", name);

autoresetwork.set();}}

}

3.程式執行結果,如下圖。

以上程式中,我們定義了兩個autoresetevent例項。其中乙個是從子執行緒往主線程發訊號 ,另乙個是主線程往子執行緒發訊號。我們在構造autoresetevent時,傳入了false,定義了這兩個例項的初始狀態unsignaled。這個狀態下,任何執行緒呼叫這兩個例項的waitone方法將會被阻塞,直到我們呼叫了set方法。如果我們在構造的時候傳入了true,則這兩個例項的初始狀態是singnaled,則執行緒呼叫waitone則會被立即處理。

五、使用manualreseteventslim類

2.**如下

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using system.threading; //

引入執行緒

using

system.diagnostics;

namespace

threadsynchronousdemo

static

void working(string name,int

seconds)

休息", name);

thread.sleep(timespan.fromseconds(seconds));

console.writeline(

" 等待開啟執行緒執行的大門",

name);

manuresetwork.wait();

console.writeline(

"執行緒執行的大門開啟了, 進行工作

", name); }}

}

3.程式執行結果,如下圖。

當主程式啟動時,首先建立manualresetevenslim類的乙個例項,然後啟動了三個執行緒,等待事件訊號通知它們繼續工作。

manualresetevenslim的工作方式有點像人群通過大門,而autoresetevent事件像乙個旋轉門,一次只能通過一人。

manualresetevenslim開啟了大門,一直保持開啟,直到呼叫了reset方法。直到再次呼叫set方法開啟 大門。

六、使用countdownevent類

1. 使用countdownevent訊號類來等待直到一定數量的操作完成。

2.**如下

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using system.threading; //

引入執行緒

using

system.diagnostics;

namespace

threadsynchronousdemo

static

void working(string message,int

seconds)

",datetime.now.second);

thread.sleep(timespan.fromseconds(seconds));

console.writeline(message);

countdownwork.signal();

console.writeline(

"發出計數訊號, 工作已經完成一項

"); }}

}

3.程式執行結果如下圖。

程式啟動時,建立了乙個countdowneven例項,在構造中指定了,當兩個操作完成時給出訊號。然後我們啟動了兩個執行緒進行工作,當第二個執行緒完成操作時,主線程從等待countdownevent的狀態中返回並繼續工作。這個類使用場景是,主線程需要等待多個執行緒完成工作之後,才能繼續的情形。

缺點:必須要等待指定數量的執行緒全部完成工作,否則就一直會等待,請確保使用countdownevent時,所有執行緒完成工作後,都要呼叫signal方法。

說明:1)  把上面**中注釋的第三個執行緒的**,還原則會出現以下錯誤。

2) 如果把 第三個執行緒啟用,同時把 countdownwork.dispose();注釋,則會出現以下錯誤資訊。

多執行緒程式設計學習筆記 執行緒同步(一)

中的示例 十,一樣如果多執行緒使用共享變數,就會涉及到乙個執行緒同步的問題。那如何解決呢?方法有三 1 重構程式,移除多執行緒的共享變數,讓乙個執行緒只訪問乙個自有變數 2 使用原子操作,乙個操作只占用乙個量子時間,一次完成,只有當當前操作完成之後,其他執行緒才能進行操作。這樣可以避免使用獨佔鎖,避...

多執行緒程式設計 執行緒同步

同步,永遠是多執行緒程式設計中最核心和最重要的話題.同步相關的概念比如 臨界區,原子操作,以及互斥量等等 總的來說,在多個執行緒之間採取同步措施,無非是為了讓他們更好的協同工作或者維持共享資料的一致性.1.共享資料的一致性 實際上,保證共享資料一致性的最簡單且最好的方法,就是使得該資料成為乙個常量,...

多執行緒程式設計2 執行緒同步

訊號量 訊號量通常有兩種 二進位制訊號量和計數訊號量。二進位制訊號量只有0和1兩種取值,計數訊號量有更大的取值範圍。訊號量一般用來保護一段 使其每次只能被乙個執行執行緒執行,要完成這個工作,可以使用二進位制訊號量。有時,希望可以允許有限數目的執行緒執行一段指定的 這時可以使用計數訊號量。建立 inc...