C 多執行緒學習筆記二

2021-10-18 09:49:51 字數 2594 閱讀 7031

記憶體欄柵

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...