golang多協程 goroutine 修改乙個全域性變數,為什麼不生效?

時間 2021-05-10 03:44:04

1樓:楊小康

儲器金字塔那個答案是對的,就是賦值快取的問題.

我們只需要在for迴圈賦值中,引導乙個條件讓出時間片,讓該協程有機會把快取寫入記憶體就行了.

比如加入GC或者Sleep等函式,操作chan都可以.

甚至在賦值的for迴圈加上另乙個非靜態的判斷條件,都可以做到.

2樓:Daniel

上面有很多回答了,估計都不是樓主要的

正確的提問方式是:show the code!

這樣你將很快獲得答案,Good Luck!

3樓:初一公主奶爸

參考儲存器金字塔。多執行緒下,如果不取位址,直接賦值,其實是修改的CPU L1快取或者L2快取的值。在主線程中列印的時候就取不到最新的值。

如果通過取位址後再賦值,會告訴cpu要將資料寫到記憶體中。

4樓:

golang裡面叫goroutine,就別叫thread了。

試了試給goroutine2的for加個迴圈次數限制,比如迴圈100次,running=0也可以把goroutine1停下了。

感覺得看看彙編才能搞明白為什麼。

python協程是什麼?

雞蛋有點黃 協程和程序的區別其他答案都寫的很好了,我就是複製一下流暢的python書中對執行緒和協程的比較說明 如果使用執行緒做過重要的程式設計,你就知道寫 出程式有多麼困難,因為排程程式任何時候都能中斷執行緒。必須記住保留鎖,去保護程式 中的重要部分,防止多步操作在執行的過程中中斷,防止資料處於無...

PHP的協程跟GO的協程實現有什麼區別?

Shulamith 黑色高階車和白色低階車的區別 swoole那個基本上就是最常見的有棧協程的實現,各種語言社群裡一抓一大把,主要作用是給只會 只能用PHP的程式設計師打雞血.go的實現則比較高階,主要優勢在於 跑在多個系統執行緒上,可以充分利用多核 讓出執行權的節點不只是io,還有函式呼叫 xtl...

為什麼無棧協程不能被非協程函式巢狀呼叫?

Ethan Lv 思考了下,發現我在幾個小時前提出這個問題的時候,對 stackful 和 stackless 的理解是不太到位的,當然現在也依然不太到位。只能簡單說下我的認知了。首先,我們給協程的簡單定義是 其區域性變數能夠保持或者說恢復。resume 時能夠跳轉回離開時的那條語句。對於 asyn...