簡體   English   中英

對類成員的線程安全訪問

[英]Thread-safe access to class members

在C ++ 03中,從兩個不同的POSIX線程中同時訪問同一對象的兩個不同的類成員是否被認為是線程安全的?

(略帶“是”的聲音)

從C ++ 03標准的角度來看,不存在諸如線程之類的東西,因此,在任何條件下,該標准都不會將涉及並發的任何事物視為“安全”。

盡管這通常是沒有問題的(稍加注意,並且適當的同步原語不在C ++的范圍之內,但它還是會“起作用”),但其中有幾件事需要注意:

  • errno (和其他結構)可能不是線程本地的。 -pthread命令行選項主要解決此問題。
  • 類成員可以通過引用,指針或聯合而互為別名,因此使不同的成員發生變異可能確實會同時使同一成員發生變異。
  • 如果沒有內存模型,則允許編譯器(並且將!)對加載和存儲進行重新排序,這意味着,例如,通過首先寫入一段數據,然后設置一個“數據就緒”標志,可以采用“顯而易見的”通信方式。不能按預期工作。
  • 在Windows下,當程序加載DLL時,在存在線程的情況下存在一些不明顯的靜態動態CRT問題。 確保所有組件都執行“同一件事” (無論是什么)。
  • 另外,某些舊版本的CRT可能會在每個線程中泄漏數百個字節的內存(通常不是問題)。
  • 不可變對象本質上是線程安全的,從多個線程進行的只讀訪問也是。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM