關於併發可見性的一點理解

2022-08-27 07:36:07 字數 438 閱讀 6170

我們從上面的圖中可以看到intel core i7 中有4核,每乙個核心中都有獨立的l1 l2 快取記憶體, 四個核心共享l3快取記憶體。

假設l1 l2快取記憶體在資料寫的時候採用的是寫回的策略,簡單來說就是僅僅更新快取記憶體中的資料,這有在根據替換策略這條資料將要被新資料替換的時候才寫回到更低層次的儲存器中。

那麼現在有這樣的場景: 每一核中都執行著乙個執行緒,而這些執行緒共享同一變數a,如果執行緒0(執行在核0)對變數a執行寫操作,那麼從圖中我們可以看到僅僅會更改核0中的l1快取記憶體,另外三個核上執行的執行緒在寫回操作(準確的說是 核0需要至少寫回到l3,而另外三個核重新從l3讀)前是不會看到這次寫操作的,這就是併發程式設計中的寫可見性問題。

以上這是暫時的理解,留作記錄以後補充。

併發程式設計 volatile的可見性

下面的 修改load函式中dosomething 0 傳入的值,從0到4,分別會出現能跳出迴圈和不能跳出迴圈兩種情況 0,什麼也不做,不能跳出迴圈 1,sleep,能跳出迴圈 2,使用system.out.println輸出,能跳出迴圈 3,等待10微秒,不能跳出迴圈 4,等待20微秒,能跳出迴圈 ...

關於並行 併發與多執行緒的一點理解

同步 就是 是完完全全按順序跑的。假如你的一段 中,呼叫了乙個函式,如readfile,它要花費5秒鐘才返回,那麼你的 就得在這個地方等待五秒。知道它完成了你才能繼續往下走。非同步 就是 在巨集觀上是按順序跑的,微觀上其實不是。仍然看readfile這個例子,用非同步方式實現的話,雖然這個函式造成的...

關於malloc的一點理解

在函式中使用malloc,如果是大的記憶體分配,而且malloc與free的次數也不是特別頻繁,使用malloc與free是比較合適的,但是如果記憶體分配比較小,而且次數特別頻繁,那麼使用malloc與free就有些不太合適了。因為過多的malloc與free容易造成記憶體碎片,致使可使用的堆記憶體...