簡體   English   中英

原子存儲拋出錯誤

[英]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.

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