8天玩轉並行開發 第五天 同步機制(下)

2021-09-06 13:46:28 字數 3107 閱讀 8048

原文 8天玩轉並行開發——第五天 同步機制(下)

出現了一系列的輕量級,今天繼續介紹下面的3個訊號量 countdownevent,semaphoreslim,manualreseteventslim。

一:countdownevent

這種採用訊號狀態的同步基元非常適合在動態的fork,join的場景,它採用「訊號計數」的方式,就比如這樣,乙個麻將桌只能容納4個

人打麻將,如果後來的人也想搓一把碰碰運氣,那麼他必須等待直到麻將桌上的人走掉一位。好,這就是簡單的訊號計數機制,從技術角

度上來說它是定義了最多能夠進入關鍵**的執行緒數。

但是countdownevent更牛x之處在於我們可以動態的改變「訊號計數」的大小,比如一會兒能夠容納8個執行緒,一下又4個,一下又10個,

載入user表:         根據user表的資料量,我們需要開5個task。

載入product表:    產品表資料相對比較多,計算之後需要開8個task。

先前的文章也說了,我們需要協調task在多階段載入資料的同步問題,那麼如何應對這裡的5,8,12,幸好,countdownevent給我們提供了

可以動態修改的解決方案。

1 using system.collections.concurrent;

2 using system.threading.tasks;

3 using system;

4 using system.diagnostics;

5 using system.collections.generic;

6 using system.linq;

7 using system.threading;

8 9 class program

10 , i);

28 }

29 30 //等待所有任務執行完畢

31 cde.wait();

32 33 console.writeline("\nuser表資料全部載入完畢!\n");

34 35 //載入product需要8個任務

36 var producttaskcount = 8;

37 38 //重置訊號

39 cde.reset(producttaskcount);

40 41 for (int i = 0; i < producttaskcount; i++)

42 , i);

47 }

48 49 cde.wait();

50 51 console.writeline("\nproduct表資料全部載入完畢!\n");

52 53 //載入order需要12個任務

54 var ordertaskcount = 12;

55 56 //重置訊號

57 cde.reset(ordertaskcount);

58 59 for (int i = 0; i < ordertaskcount; i++)

60 , i);

65 }

66 67 cde.wait();

68 69 console.writeline("\norder表資料全部載入完畢!\n");

70 71 console.writeline("\n(*^__^*) 嘻嘻,恭喜你,資料全部載入完畢\n");

72 73 console.read();

74 }

75 76 static void loaduser(object obj)

77 正在載入user部分資料!", obj);

81 }

82 finally

83 86 }

87 88 static void loadproduct(object obj)

89 正在載入product部分資料!", obj);

93 }

94 finally

95 98 }

99 100 static void loadorder(object obj)

101 正在載入order部分資料!", obj);

我們看到有兩個主要方法:wait和signal。每呼叫一次signal相當於麻將桌上走了乙個人,直到所有人都搓過麻將wait才給放行,這裡同樣要

注意也就是「超時「問題的存在性,尤其是在平行計算中,輕量級別給我們提供了」取消標記「的機制,這是在重量級別中不存在的,比如下面的

過載public bool wait(int millisecondstimeout, cancellationtoken cancellationtoken),具體使用可以看前一篇文章的介紹。

二:semaphoreslim

在.net 4.0之前,framework中有乙個重量級的semaphore,人家可以跨程序同步,咋輕量級不行,msdn對它的解釋為:限制可同時訪問

某一資源或資源池的執行緒數。關於它的重量級demo,我的上乙個系列有演示,你也可以理解為countdownevent是 semaphoreslim的功能加

強版,好了,舉乙個輕量級使用的例子。

同樣,防止死鎖的情況,我們需要知道」超時和取消標記「的解決方案,像semaphoreslim這種定死的」執行緒請求範圍「,其實是降低了擴充套件性,

所以說,試水有風險,使用需謹慎,在覺得有必要的時候使用它。

三: manualreseteventslim

相信它的重量級別大家都知道是manualreset,而這個輕量級別採用的是"自旋等待「+」核心等待「,也就是說先採用」自旋等待的方式「等待,

直到另乙個任務呼叫set方法來釋放它。如果遲遲等不到釋放,那麼任務就會進入基於核心的等待,所以說如果我們知道等待的時間比較短,採

用輕量級的版本會具有更好的效能,原理大概就這樣,下面舉個小例子。

8天玩轉並行開發 第五天 同步機制(下)

原文 8天玩轉並行開發 第五天 同步機制 下 出現了一系列的輕量級,今天繼續介紹下面的3個訊號量 countdownevent,semaphoreslim,manualreseteventslim。一 countdownevent 這種採用訊號狀態的同步基元非常適合在動態的fork,join的場景,...

開發第五天小記

一 內部類 放在類或方法內部的類 1 內部類被當成其外部類成員 例如person這個類,private class run,則run屬於person共有的,即外部類本身 而 小明 new person,小明可能1歲,還不會run,即不屬於外部類的某個物件 類和例項區別參照上面的小明 3 靜態內部類,...

PHP第五天 錯誤機制

錯誤處理 錯誤分類 語法錯誤 程式不能執行,是在執行之前,檢查語法的時候,就發現語法出錯,結果是提示錯誤,不執行程式。執行時錯誤 語法檢查沒錯,然後開始執行,在執行 現了錯誤,然後報錯。這是開發中最常見的錯誤。邏輯錯誤 程式能執行,且一直到結束沒有報錯,但執行得到的結果卻是錯的。常見錯誤代號 重點 ...