>>返回《c# 併發程式設計》
多執行緒共享變數
[threadstatic]
特性、threadlocal
、callcontext
、asynclocal
都具備這個特性。
例子:由於 .net core 不再實現 callcontext,所以下列**只能在 .net framework 中執行
class program
的資料";
_normalstatic = value;
_threadstatic = value;
callcontext.setdata("value", value);
_threadlocal.value = value;
_asynclocal.value = value;
console.writeline($"use normal; thread:; value:");
console.writeline($"use threadstaticattribute; thread:; value:");
console.writeline($"use callcontext; thread:; value:");
console.writeline($"use threadlocal; thread:; value:");
console.writeline($"use asynclocal; thread:; value:");
});console.read();
}}
輸出:
use normal; thread:15; value:10
use [threadstatic]; thread:15; value:15
use normal; thread:10; value:10
use normal; thread:8; value:10
use [threadstatic]; thread:8; value:8
use callcontext; thread:8; value:8
use [threadstatic]; thread:10; value:10
use callcontext; thread:10; value:10
use callcontext; thread:15; value:15
use threadlocal; thread:15; value:15
use threadlocal; thread:8; value:8
use asynclocal; thread:8; value:8
use threadlocal; thread:10; value:10
use asynclocal; thread:10; value:10
use asynclocal; thread:15; value:15
結論:
日常開發過程中,我們經常遇到非同步的場景。
非同步可能會導致**執行執行緒的切換。
例如:測試:[threadstatic]
特性、threadlocal
、asynclocal
,三種共享變數被非同步**賦值後的表現。
class program
private static void printvaluesinanotherthread()
");console.writeline($"threadlocal: ");
console.writeline($"asynclocal: ");
});}
}
輸出:
threadstatic:
threadlocal:
asynclocal: set
結論:
在非同步發生後,執行緒被切換,只有asynclocal
還能夠保留原來的值.
我們總結一下這些變數的表現:
實現方式
dotnetfx
dotnetcore
是否支援資料向輔助線程的
[threadstatic]是是
否threadlocal是是
否callcontext.setdata(string name, object data)是否
僅當引數 data 對應的型別實現了 ilogicalthreadaffinative 介面時支援
callcontext.logicalsetdata(string name, object data)是否
是asynclocal是是
是輔助線程: 用於處理後台任務,使用者不必等待就可以繼續使用應用程式,比如執行緒池執行緒。
注意:
new task(...)
預設不是新建乙個執行緒,而是使用執行緒池執行緒
m_localvalues
型別是iasynclocalvaluemap
以下為基礎設施提供的實現:
型別元素個數
emptyasynclocalvaluemap
0oneelementasynclocalvaluemap
1twoelementasynclocalvaluemap
2threeelementasynclocalvaluemap
3multielementasynclocalvaluemap
4 ~ 16
manyelementasynclocalvaluemap
> 16
隨著executioncontext所關聯的asynclocal數量的增加,iasynclocalvaluemap的實現將會在executioncontext
的setlocalvalue
方法中被不斷替換。
參考資料:《** .net 中 asynclocal 的實現原理》 --- 黑洞視界
多執行緒共享變數 多執行緒共享全域性變數
1.多執行緒的執行順序是無序的 像2個人賽跑,乙個先跑乙個後跑,但根據每個人跑的速度不一樣,跑一半,二者可能跑在一起去了。2.又因為多執行緒是共享乙個全域性變數的,就導致資料容易被弄髒 假如老闆讓兩個員工寫兩個主題ppt,若這兩個人沒商量好,都做了同乙個主題的ppt,導致不但速度很慢,且這個ppt有...
多執行緒共享變數
題目如下 設計4個執行緒,其中兩個執行緒每次對j增加1,另外兩個執行緒對j每次減少1。如果每個執行緒執行的 相同 可以使用同乙個runnable物件,這樣在不同的執行緒中只需要把這個runnable物件傳到裡面去即可,因為runnable物件的run方法天熱原子性,不可能run方法被打斷,乙個run...
多執行緒共享變數
from threading import thread,lock global num 0 def func1 global global num 全域性變數 for i in range 1000000 lock.acquire 兩個執行緒會最開始搶這個鎖,拿到鎖就會處於關鎖,執行後面的程式,其...