1

我最近升级到了兼容 C++11 的编译器,我试图将一些代码从 boost 更新到 c++11 标准。使用 atomic_store over 转换一些代码时遇到了问题。这是一些简单的测试代码,似乎给我抛出了编译器错误。

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 的方式是否发生了变化?我现在需要创建共享指针的原子对象吗?

4

2 回答 2

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 原子访问 | 部分的

于 2014-07-07T20:26:54.950 回答
0

目前,防止竞争条件(当在一个线程中复制的智能指针在另一个线程中同时重置时)唯一安全且可行的方法是在访问这些对象时始终使用互斥锁,但这比它需要的成本更高,尤其是。如果多个读者试图在大致相同的时刻读取数据(这在发布者/订阅者模型中很典型)。

于 2014-07-07T20:26:13.530 回答