2012-04-07 70 views
8

我在我的代碼中大量使用了<thread> <atomic> <mutex>等,其中包括幾個無鎖算法。我的目標(最終)是一個Linux環境。我一直在用Visual Studio 2011 Beta進行開發,雖然在其他C++ 11功能中缺少可怕的東西,但似乎是實現併發功能的唯一工具鏈。並行C++ 11 - 可以使用哪些工具鏈?

見C++ 11的支持位置:

現在,如果別人根本沒有包含C++ 11併發提供圖書館,我可以輕鬆地使用just::thread,但是clang和gcc都對C++ 11內存模型回答「no」,至少visual C++似乎支持這個模型。我不確定這會產生什麼樣的影響 - 可能會優化掉顯然無副作用的代碼以及其他錯誤的東西。

如果現在我完全避免優化構建,並且僅編譯調試構建而未啓用優化 - 使用Clang或GCC工具鏈是否合理?

+4

我的猜測是,如果你使用'just :: thread',它會正常工作。它使用原生的(Posix或Win32)原語來強制排序等事情,所以我認爲編譯器通常會因爲失敗而被嚴重破壞。 – 2012-04-07 15:51:49

+1

你應該在你的列表中包含一個多線程相關標籤,Anthony Williams經常在這裏出現,所以如果你足夠幸運,他會注意到。我認爲他創建了'just :: thread',以便它是跨平臺的,所以我不會期望任何問題。 – 2012-04-07 17:13:30

回答

1

我在64位linux和windows上使用過gcc-4.7,並且成功。即使使用gcc-4.6,也可以在linux上完美工作。
在窗口gcc-4.7(mingw64)有一些小問題,內存泄漏與std::condition_variable AFAIR析構。

4

GCC 4.7 status

C++內存模型的工作正在進行中,預計在未來 GCC釋放完成。 GCC 4.7現在已經發布,所以這就是你可以從中得到的結果 。

  • 支持無鎖指令的完整原子實現。所有的原子操作都已使用新的__atomic 內置函數實現,並且大多數目標都反映了生成的代碼 中的內存模型參數。優化不會通過原子操作移動共享內存 操作,因此會發生各種不同的關係。
  • 當無鎖指令不可用(通過硬件或操作系統支持)時,原子操作留作函數調用 以由庫解析。由於時間限制以及未定稿的API,GCC 4.7中沒有提供libatomic。這是 很容易通過遇到不滿意的外部符號 開始於_ 原子 *。
  • 如果程序需要庫支持,則可以編譯一個C文件樣本實現並將其與 客戶端程序鏈接,以使用鎖定的 實現解決這些外部函數調用。下載libatomic示例
  • C++模板完全支持任意大小的對象,儘管前面提到的libatomic.c文件可能需要滿足某些 用戶定義的類。如果一個類映射到與無鎖整數類型相同的大小,則也將使用無鎖定例程。
  • 位域不符合內存模型。也就是說,他們可能會在讀或寫時由於整個單詞 的訪問而引入加載或存儲數據競爭。
  • 儘管已完成一些工作,但未對合規性進行全面審覈。一些優化可能引入之前不存在的新數據 。已知案例的數量爲 很小,並且對合規性的測試不是微不足道的。如果有人遇到 這種優化引入了新數據競爭的情況,請打開一個 bugzilla案例,以便解決。

支持在LLVM似乎走得更遠:http://llvm.org/releases/3.0/docs/Atomics.html

這很難說,到什麼程度,這是在鐺實際使用不過。看起來好像<atomic>基本適用於某些類型。我收到了其他類型的編譯器斷言,說其原子類型是意外的,這使得它可以處理的類型有點信心。

+0

這看起來很有前途。我實際上傾向於clang,因爲它似乎產生更多有用的錯誤消息 - 這對我來說是一個實質性的時間同步C++。有一個實驗性的QtCreator使用clang來實現代碼模型(完成,高亮,重構等)。我將嘗試一下,因爲我真的很想念我的visual studio + visual basic x on linux。 – Eloff 2012-04-09 00:04:25

相關問題