記憶體欄柵
variable var => thread t1,t2
(1) t1,t2 共享var => public 有「鎖」的問題
(2) t1,t2 各自有乙個var => internal 沒有鎖爭用的問題
var slot = thread.
allocatedataslot
("username");
//主線程上設定槽位,也就是說hello word只能被主線程讀取,其他執行緒無法讀取
thread.
setdata
(slot,
"hello word!!");
newthread((
)=>
",obj);}
).start()
;var obj2 = thread.
getdata
(slot)
;console.
writeline
("主線程:"
,obj2)
;console.
readkey()
;
[
threadstatic
]static
string username =
"??!!"
;static
void
main
(string
args)
", username);}
).start()
; console.
writeline
("主線程:"
, username)
; console.
readkey()
;}
threadlocal<
string
> local =
newthreadlocal
<
string
>()
;local.value =
"hello word!!"
;new
thread((
)=>
", local.value);}
).start()
;console.
writeline
("主線程:"
, local.value)
;console.
readkey()
;
實際專案中,發布版本都是release版本,而不是debug版本,因為release中做了一些**和快取的優化,比如將一些資料從memory中讀取到cpu快取記憶體中。這一操作可能會帶來一些bug。
下面這段**在release環境下出現主線程不能執行結束的問題。
var isstop =
false
;thread t =
newthread((
)=>})
;t.start()
;thread.
sleep
(1000);
isstop =
true;t.
join()
;console.
writeline
("主線程執行結束");
console.
readkey()
;
從**中可以發現兩個執行緒在共用乙個isstop變數,而執行緒t會將該變數載入到cpu cache中,當主線程對isstop進行修改後,執行緒t感知不到。
兩個解決方法:
1. 不要讓多個執行緒去操作乙個共享變數,否則容易出現問題。
2. 如果一定要這麼做,則需要不進行快取,每次都從memory中讀取資料。
在此方法之前的記憶體寫入都要及時從cpu cache中更新到memory,在此方法之後的記憶體讀取都要從memory中讀取而不是cpu cache。
memorybarrier:
var isstop =
false
;thread t =
newthread((
)=>})
;t.start()
;thread.
sleep
(1000);
isstop =
true;t.
join()
;console.
writeline
("主線程執行結束");
console.
readkey()
;
volatileread:
var isstop =0;
thread t =
newthread((
)=>})
;t.start()
;thread.
sleep
(1000);
isstop =1;
t.join()
;console.
writeline
("主線程執行結束");
console.
readkey()
;
C 多執行緒 學習筆記(二)
程序 基於程序的多工處理是程式的併發執行。執行緒 基於執行緒的多工處理是同一程式的片段的併發執行。c 多執行緒寫法,從入門開始,一點點往下寫,我也不知道能學到精通還是到放棄。根據主流的一些部落格技術文件,循序漸進,適於新手入門。首先第乙個程式是直接使用多執行緒建立函式建立多個執行緒。編譯的時候需要靜...
多執行緒學習筆記二
傳統執行緒 time 下午06 15 19 author retacn yue email zhenhuayue sina.com public class traditionalthread catch interruptedexception e system.out.println threa...
多執行緒學習筆記(二)
上一節講到lock鎖,還有一種鎖就是monitor 監視器 區別lock鎖對鎖定的物件一直要等當前程序全部處理完才能讓其他程序進入。monitor鎖可以程式控制解鎖,只是在程序進行某一部分運算時進行上鎖,等執行結束時可以解鎖供其他程序進行運算 注 錯誤 從不同步的 塊中呼叫了物件同步方法 原因一 m...