std :: atomic和custom结构的问题

时间:2017-09-11 22:27:02

标签: c++ struct atomic stdatomic

出于某种原因似乎无法做到这一点(见代码)。看看文档,似乎没有理由不这样做......

struct vector {
    float x, y, z;
};
std::atomic<vector> Name = {0};

它说我无法使用初始化列表初始化它,当我在我的代码中使用它时,它表示它没有成员。

Name.x = 4.f;
Name.y = 2.f * Name.x;
Name.z = 0.1f;

3 个答案:

答案 0 :(得分:3)

std::atomic<vector>的实例不是vector的实例。它没有xyz作为成员。它具有的功能(概念上,内部)是vector的实例。但是您无法使用.运算符访问它,因为这会破坏原子性,就像std::atomic的点。 (这也是您无法使用初始化列表的原因。)

要访问vector内容,请使用load()store()

//atomically load a snapshot of Name
auto name_snapshot = Name.load(); //name_snapshot is a vector instance
name_snapshot.x = 4.f;
name_snapshot.y = 2.f * name_snapshot.x;
name_snapshot.z = 0.1f;
//now atomically store it:
Name.store(name_snapshot);

答案 1 :(得分:2)

这里有std::atomic<> http://en.cppreference.com/w/cpp/atomic/atomic

的文档

std::atomic<>上没有成员x,y和z。

std::atomic<X>是一种类型,其中整个 X可以原子方式替换,而不是单个部分。

你可能想要的是一个互斥锁,因为对于像name_snapshot这样的结构,std :: atomic在任何情况下都会使用互斥锁。由于不太可能存在可用的原子指令来处理整个结构的原子加载/存储。

答案 2 :(得分:-1)

Name._My_val.x, Name._My_val.y, Name._My_val.z而非Name.x, Name.y, Name.z

为什么没有人告诉我这超出了我,无论如何。