多執行緒共享變數和 AsyncLocal

2021-10-05 05:13:18 字數 3384 閱讀 1726

>>返回《c# 併發程式設計》

多執行緒共享變數

[threadstatic]特性、threadlocalcallcontextasynclocal都具備這個特性。

例子:由於 .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]特性、threadlocalasynclocal,三種共享變數被非同步**賦值後的表現。

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實現將會在executioncontextsetlocalvalue方法中被不斷替換

參考資料

《** .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 兩個執行緒會最開始搶這個鎖,拿到鎖就會處於關鎖,執行後面的程式,其...