專案開發中應用併發的一二事

2022-02-18 07:40:25 字數 2841 閱讀 1571

在多執行緒環境下,使用blockingcollection以及concurrentqueue來消費生產者生產的資源,這是我自己寫的多生產者多消費者的作法,其實也是基於單個task下的阻塞佇列的iscomplete來識別的。

使用阻塞佇列更簡單但是內部的消費者執行緒比較適合使用單獨的執行緒不適合使用執行緒池,而且阻塞隊列為空時會阻塞消費者執行緒,當然阻塞執行緒池內的執行緒也沒什麼影響只是不推薦這麼做,而且阻塞的佇列的效能也沒有concurrentqueue的效能高。

我在專案中遇到多生產者多消費者問題,多生產者沒有問題,但是如何在多執行緒下消費生產者的資源,這就是比較麻煩了,不能僅僅通過判斷數量來做,網上也找了一些資源,但是也都是給了個demo,還不全,自己想了個方法,暫時解決了,回頭在研究下別人封裝的基於thread的作法。其實是在<<.net 中的阻塞佇列blockingcollection的正確開啟方式》基礎上做的,也沒有什麼,但是這是個好思路。後續嘗試自己封裝執行緒標誌來做,不依靠fcl的阻塞佇列。code如下:

concurrentdictionary dic1 = new concurrentdictionary();

concurrentdictionary

dic2 = new concurrentdictionary();

concurrentqueue

queue = new concurrentqueue();

blockingcollection

blockingcollection = new blockingcollection();

var t = new task[50

]; console.writeline(

"生產者開始寫入資料.............\r\n");

for(int i=0; i<=49; i++)

", param.tostring());

blockingcollection.add(param.tostring());

console.writeline(

"生產者中 *** 阻塞佇列的數量是:

", blockingcollection.count);

console.writeline(

"生產者中 *** 字典dic1輸入:

", param.tostring());

dic1.tryadd(param.tostring(), param.tostring());

console.writeline(

"生產者中 *** 字典dic1的數量是:

", dic1.count);

console.writeline(

"生產者中 *** 字典dic2輸入:

", param.tostring());

dic2.tryadd(param.tostring(), param.tostring());

console.writeline(

"生產者中 *** 字典dic2的數量是:

", dic2.count);

console.writeline(

"生產者中 *** 佇列輸入:

", param.tostring());

queue.enqueue(param.tostring());

console.writeline(

"生產者中 *** 佇列的數量:

", queue.count);

}, i);

}console.writeline("

\r\n消費者開始讀入資料.............\r\n");

// 當iscompleted標記為true時,getconsumingenumerable方法就可以跳出迴圈了,因此while可以加也可以不加

while (!blockingcollection.iscompleted)

", dic1.count);

console.writeline(

"消費者中 *** 字典dic2的數量是:

", dic2.count);

console.writeline(

"消費者中 *** 阻塞佇列的數量是:

", blockingcollection.count);

string value1 = ""

;

string value2 = ""

; dic1.trygetvalue(b,

outvalue1);

dic2.trygetvalue(b,

outvalue2);

console.writeline(

"消費者中 *** 字典dic1的鍵值的value值是:

", b, value1);

console.writeline(

"消費者中 *** 字典dic1的鍵值的value值是:

", b, value2);

console.writeline(

"消費者中 *** 佇列的數量是:

", queue.count);

console.writeline(

"消費者中 *** 字典的數量是:

", dic1.count);

if (queue.count == 50

)

}});

}console.writeline(

"是否完成新增:

", blockingcollection.iscompleted);

參考:.net中的並行程式設計-7.基於blockingcollection實現高效能非同步佇列

類模板在專案開發中的應用

模板是c 型別引數化的多型工具。c 提供函式模板和類模板。模板定義以模板說明開始。類屬引數必須在模板定義中至少出現一次。同乙個類屬引數可以用於多個模板。類屬引數可用於函式的引數型別 返回型別和宣告函式中的變數。模板由編譯器根據實際資料型別例項化,生成可執行 例項化的函式。模板稱為模板函式 例項化的類...

開發Web專案 VSS中的相關應用

vss中的相關應用 由於在dw中可以對vss的檔案進行常規操作,開發人員不需要經常到vss客戶端中進行操作,但比如為 設定版本 恢復檔案等操作需要在vss中進行。vss記錄了乙個源 檔案從建立 修改到發布的全過程,記錄了每次對該檔案的check in操作,所以在源 查錯除錯方面非常有用。下面將介紹v...

實際應用中installshield的事件處理

比如 建立乙個installshield工程之後 intallshield程式 會自動生成程式執行的 看指令碼 生成了乙個 function onfirstuibefore 該方法是用於 在安裝程式執行期間的 所有視窗的 你可以隨意修改 需要哪些視窗 去掉哪些視窗 比如現在有這樣乙個 問題 我需要在...