原子商店抛出错误

时间:2014-07-07 19:59:13

标签: c++ c++11 stdatomic

我最近升级到兼容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的方式有变化吗?我现在需要创建共享指针的原子对象吗?

2 个答案:

答案 0 :(得分:4)

以下代码与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原子访问|部分

答案 1 :(得分:0)

目前是防止种族状况的唯一安全可行的方法(何时 在一个线程中复制的智能指针同时重置 另一种方法是在访问这些对象时始终使用互斥锁,但那样做 比它需要的更贵,尤其是如果是多个读者 试图在大致相同的时刻读取数据(这是典型的 出版商/订阅者模型)。