如果我在硬件上使用原子讀取和遞增/遞減支持,我可以在C++ 03中使用volatile sig_atomic_t
來訪問原子操作並避免完整的互斥量,或者我必須等待C++ 11和std::atomic<int>
?我可以使用volatile sig_atomic_t來避免C++ 03中的互斥量嗎?
1
A
回答
5
一些編譯器爲volatile
提供了非標準語義,它將允許它工作,但它不是可移植的。 volatile
用於訪問硬件,而不是用於線程間通信。無法保證一個線程對一個volatile
變量的寫入將永遠對另一個線程可見 - 對於線程之間的通信,您需要同步諸如內存屏障等操作,這些操作由類型爲std::atomic
的操作提供。
欲瞭解更多信息請參閱"volatile vs. volatile"和漢斯·貝姆的ISO C++紙"Should volatile Acquire Atomicity and Thread Visibility Semantics?"
(從腳註送往最近Herb Sutter blog post兩個鏈接)你不必等待在你的編譯器C++ 11的支持,雖然,大多數平臺提供了一些特定於平臺的原子操作,這些操作還包括任何必要的內存障礙, GCC的__sync
內置,Solaris的原子操作或Win32的互鎖功能。還有便攜式庫,如提議的Boost.Atomic,它們提供了平臺特定實現的通用接口。
相關問題
- 1. 我可以使用互鎖操作更新多個值以避免鎖定臨界區/互斥量嗎?
- 2. 使用互斥量後程序仍然崩潰(我可以在同一線程中使用互斥量嗎?)
- 3. 我可以避免使用`asmatrix`嗎?
- 4. C#指向變量的指針 - 我可以避免它嗎?
- 5. DataMapper-我可以避免中間表嗎?
- 6. 我可以使用來自threads :: shared模塊(如互斥鎖)的鎖嗎?
- 7. Java中互斥線程的互斥量?
- 8. 帶互斥量和信號量的volatile關鍵字
- 9. 這裏可以避免使用CURSOR嗎?
- 10. 多線程互斥鎖可以使用多個互斥鎖
- 11. volatile變量而不是互斥鎖變量來檢查改變的數據
- 12. Javascript:我可以避免關閉嗎?
- 13. PDO:我可以避免bindParam嗎?
- 14. 函數可以鎖定互斥鎖嗎?
- 15. 可以互斥掛起執行嗎?
- 16. 我可以避免使用Grape在Groovy中加載模塊嗎?
- 17. 我可以避免在Seq.iter中使用括號嗎?
- 18. 使用C++併發性,我需要使用互斥嗎?
- 19. 避免競爭條件下使用std ::互斥
- 20. 可以使用try ... catch機制來避免內存崩潰嗎?
- 21. 我可以混合使用基於futex的互斥體與glibc-2.2 linuxthreads互斥體嗎?
- 22. 遞歸函數可以釋放它自己的互斥量嗎?
- 23. C++可變的互斥
- 24. 我可以使用CloudBees Jenkins Enterprise來避免開源jenkins的連接問題嗎?
- 25. C Pthreads互斥量值?
- 26. C++ 03:相互排斥的方法,由於enable_if
- 27. 這是可能的攻擊嗎?我可以避免它嗎?
- 28. 我可以使用什麼來避免郵件大小限制?
- 29. 我可以避免Java EE創建輕量級網頁嗎?
- 30. 有人可以幫我避免使用eval()嗎?