std::atomic 作为 std::map 的值
std::atomic as a value of std::map
我想在映射中使用原子变量。我正在使用 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;
产生错误:
error C2248: std::atomic<__int64>::atomic
: cannot access private member declared in class std::atomic<__int64>
gcc 4.7 也是如此 (see here)
error: use of deleted function std::atomic<long int>::atomic(const std::atomic<long int>&)
然而,在 Visual Studio 2013 (msvc-12) 及更高版本以及 gcc 4.8 及更新版本中,它工作正常。
自己看gcc 4.8 and Visual Studio 2013+
我可以在 msvc-11 / gcc 4.7 中做些什么来让它工作?
我无法访问 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;
}
在@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;
}
我想在映射中使用原子变量。我正在使用 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;
产生错误:
error C2248:
std::atomic<__int64>::atomic
: cannot access private member declared in classstd::atomic<__int64>
gcc 4.7 也是如此 (see here)
error: use of deleted function
std::atomic<long int>::atomic(const std::atomic<long int>&)
然而,在 Visual Studio 2013 (msvc-12) 及更高版本以及 gcc 4.8 及更新版本中,它工作正常。
自己看gcc 4.8 and Visual Studio 2013+
我可以在 msvc-11 / gcc 4.7 中做些什么来让它工作?
我无法访问 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;
}
在@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;
}