當前位置: 華文問答 > 數碼

多執行緒編程中什麽情況下需要加 volatile?

2016-04-06數碼

C/C++多執行緒編程中不要使用volatile。
(註:這裏的意思指的是指望volatile解決多執行緒競爭問題是有很大風險的,除非所用的環境系統不可靠才會為了保險加上volatile,或者是從極限效率考慮來實作很底層的介面。這要求編寫者對程式邏輯走向很清楚才行,不然就會出錯)

C++11標準中明確指出解決多執行緒的數據競爭問題應該使用原子操作或者互斥鎖。

C和C++中的volatile並不是用來解決多執行緒競爭問題的,而是用來修飾一些因為程式不可控因素導致變化的變量,比如存取底層硬件器材的變量,以提醒編譯器不要對該變量的存取擅自進行最佳化。

多執行緒場景下可以參考【Programming with POSIX threads】的作者Dave Butenhof對

Why don't I need to declare shared variables VOLATILE?

這個問題的解釋:

comp.programming.threads FAQ

簡單的來說,對存取共享數據的程式碼塊加鎖,已經足夠保證數據存取的同步性,再加volatile完全是多此一舉。

如果光對共享變量使用volatile修飾而在可能存在競爭的操作中不加鎖或使用原子操作對解決多執行緒競爭沒有任何卵用,因為volatile並不能保證操作的原子性,在讀取、寫入變量的過程中仍然可能被其他執行緒打斷導致意外結果發生。