[英]Atomic store throwing error
我最近升級到了C ++ 11兼容的編譯器,並且試圖將某些代碼從boost升級到c ++ 11標准。 使用atomic_store轉換某些代碼時遇到問題。 這是一些簡單的測試代碼,似乎對我來說引發了編譯器錯誤。
int main()
{
std::shared_ptr<int> m = std::make_shared<int>();
*m = 1;
std::shared_ptr<int> a = std::make_shared<int>();
*a = 2;
std::atomic_store(&m,std::move(a));
std::cout << *m << std::endl;
}
std::atomic_store(&m,std::move(a));
行為我拋出了一個編譯器錯誤:
'std::shared_ptr<int>' is not derived from 'volatile std::atomic<_ITp>'
std::atomic_store(&m,std::move(a));
^
從boost升級到C ++ 11時atomic_store的方式是否發生了變化? 現在是否需要創建共享指針的原子對象?
以下代碼可以使用Clang 3.5進行編譯:
#include <memory>
int main()
{
std::shared_ptr<int> foo, bar;
std::atomic_store(&foo, bar);
}
但是,它不能與GCC 4.9一起編譯。 上面的代碼顯示一條錯誤消息, atomic_store
不是std
的成員。 如果我還包括<atomic>
,則編譯器將打印錯誤消息,該消息顯示在問題中。
顯然,GCC 4.9不支持std::shared_ptr
原子操作。 另請參閱libstdc ++的文檔:
20.7.2.5 | shared_ptr原子訪問| 部分的
當前,防止競爭狀態(當在一個線程中復制智能指針並發到另一個線程中同時重置)的唯一安全可行的方法是在訪問這些對象時始終使用互斥體,但這比所需的代價昂貴,尤其是。 如果多個讀取器試圖在大約同一時間讀取數據(這是發布者/訂閱者模型中的典型值)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.