std :: atomic作为std :: map

时间:2016-01-29 18:20:18

标签: c++11 dictionary visual-studio-2012 gcc atomic

我想在地图中使用原子变量。我使用的是Visual Studio 2012(msvc-11)和gcc 4.7。我已经定义了一个类型:

typedef std::map<uint64_t, std::atomic<int64_t>> value_map_t;

在msvc-11中,行

value_map_t map;
map[1] = 0;

产生错误:

  

错误C2248:std::atomic<__int64>::atomic:无法访问类std::atomic<__int64>中声明的私有成员

gcc 4.7(see here

也是如此
  

错误:使用已删除的函数std::atomic<long int>::atomic(const std::atomic<long int>&)

但是,在Visual Studio 2013(msvc-12)及更高版本以及gcc 4.8及更高版本中,它可以正常工作。

自己查看gcc 4.8Visual Studio 2013+

我可以在msvc-11 / gcc 4.7中做些什么来使它工作?

2 个答案:

答案 0 :(得分:2)

我无法访问Visual C ++编译器,但我猜测以下内容可能有效。使用间接,利用atomic s:

的映射到(智能)指针
#include <atomic>
#include <map>
#include <memory>


using atomic_ptr_t = std::shared_ptr<std::atomic<int64_t>>;
typedef std::map<uint64_t, atomic_ptr_t> value_map_t;


int main()
{
    value_map_t map;
    map[1] = atomic_ptr_t(new std::atomic<int64_t>(0));

    return 0;
}

答案 1 :(得分:1)

来自@Yam Marcovic的提示我在Visual Studio 2012中找到了如何做到这一点:

#include <atomic>
#include <map>
#include <tuple>

typedef std::atomic<int64_t> value_t;
typedef std::map<uint64_t, value_t> atomic_map_t;

int main()
{
    int64_t in = 5;

    atomic_map_t map;
    map.emplace(std::piecewise_construct, 
            std::forward_as_tuple(1), std::forward_as_tuple(in));

    auto it = map.find(1);
    int64_t out =  it->second.load(); 

    return 0;
}