2015-01-15 103 views
0

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

+0

在C++ 03中沒有標準的內存模型,所以從C++標準的角度來看這個問題是不可能的。 – kraskevich

+0

由於它們是不同的內存位置,儘管無論內存/一致性模型如何,它都應該是線程安全的,除非線程試圖在這些成員上進行同步。 – computador7

+1

@ computador7我們特別需要C++中的內存模型,因爲你所說的不是真實的 - 如果編譯器不知道某個環境是多線程的,它將執行多種優化,這些優化往往涉及觸及不應該存在於內存中的內存位置多線程環境。也就是說,'-pthread'應該至少可以部分解決這個問題。 – Griwes

回答

0

(具有「是」有點語音)

從視C++ 03標準的角度來看,作爲線程沒有這樣的東西存在,所以有任何不存在的條件下,其該標準將任何涉及併發性的內容視爲「安全」。雖然這通常沒有問題(在C++範圍之外的一點注意和適當的同步原語,它將「無論如何」),但有幾件事要注意,其中包括:

  • errno(和其他結構)可能不是線程本地的。命令行選項-pthread主要解決這個問題。
  • 類成員可以通過引用,指針或工會互爲別名,所以變異不同成員的確可能發生變異相同成員兼
  • 沒有內存模型,編譯器被允許(並會!)重新排序加載和存儲,這意味着例如首先寫入一段數據,然後設置「數據已準備就緒」標誌的「明顯」通信方式可能無法按預期工作。
  • 在Windows下,當程序加載DLL時,在線程存在時會存在一些不太明顯的靜態動態CRT問題。確保所有組件都做「同樣的事情」(不管它是什麼)。
  • 此外,CRT的一些舊版本可能會泄漏每個線程幾百字節的內存(通常不是問題)。
  • 不可變對象本質上是線程安全的,就像來自多個線程的只讀訪問一樣。