Mutex和記憶體可見性

2021-09-08 10:23:04 字數 932 閱讀 1096

ieee 1003.1-2008定義了xbd 4.11記憶體同步中的記憶體可見性規則。特別地,posix實現保證:

pthread_join()同步:任何變數由某執行緒在結束之前修改,那**(join)它的另一線程 在pthread_join()完成後是可見的。

mutex操作——pthread_lock(), pthread_timedlock(), pthread_trylock() , pthread_unlock()同步:任何變數由執行緒對mutex解鎖之前修改,對後面成功鎖住同一mutex的執行緒是可見的,請參閱圖2。再強調一次,如果鎖住另乙個mutex,或者根本沒有加鎖,又或者變數在pthread_unlock之後又被修改的,這一規則不保證。

圖2:mutex引入正確的記憶體可見性

讀完本文後,你應該弄明白cert pos03-c編碼規則背後的原因:

pos03-c:請勿使用volatile作為同步原語

只要遵從posix的記憶體可見性規則這條底線,編寫出來的**理所當然是安全的。特別當乙個執行緒寫某個值,而另一線程讀此值時,即使能保證原子訪問,仍需要使用mutex來構造適當的記憶體同步訪問。

posix 記憶體可見性:

在實際應用的使用方法:

其次,任何時候兩個執行緒需要訪問相同資料時,你就需要應用其中一條記憶體視覺化規則,大多數情況下是指使用互斥量,這不僅是為了保護多個寫操作,即使執行緒是讀資料,它也需要鎖住互斥量以確保讀到最新的資料值。

有一些特別的情況下不需要使用互斥量來確保可視性。如果執行緒設定了乙個全域性變數,然後建立了乙個新執行緒讀取同乙個變數,則新執行緒將看不到舊的變數值(只能看到改過的新的變數值)。但是,若你建立了乙個新執行緒然後再設定變數的值,則新執行緒可能看不到新的變數值,即使原執行緒在新執行緒讀取資料之前向變數內寫入了新值。

volatile 記憶體可見性

public class volatilethread implements runnable catch interruptedexception e flag true system.out.println flag isflag public boolean isflag public cla...

Volatile 記憶體可見性

一 當寫乙個volatile變數時,jmm會把該執行緒對應的本地中的共享變數值重新整理到主記憶體。例子 一 volatile 關鍵字 當多個執行緒進行操作共享資料時,可以保證記憶體中的資料可見。相較於 synchronized 是一種較為輕量級的同步策略。注意 1.volatile 不具備 互斥性 ...

定位和可見性

定位 position relative 如果對元素本身進行相對單位,那麼元素會偏離原來的位置,但是原來的位置還存在文件流中。position absolute 如果對意思進行相對於某個元素的絕對定位,那麼元素從文件流分離出來,原來位置不存在了。可見性 visibility visible 元素可見...