std::atomic 和自定义结构的问题
Issue with std::atomic and custom structs
出于某种原因似乎无法执行此操作(请参阅代码)。查看文档,似乎没有理由不工作...
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;
std::atomic<vector>
的实例不是 vector
的实例。它没有 x
、y
或 z
作为成员。它所拥有的(概念上的,内部的)是 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);
这里有 std::atomic<>
的文档 http://en.cppreference.com/w/cpp/atomic/atomic
std::atomic<>
.
上没有成员 x、y 和 z
std::atomic<X>
是一种类型,其中 整个 X 可以原子替换,而不是它的各个部分。
您可能想要的是互斥锁,因为对于像 name_snapshot
这样的结构,std::atomic 在任何情况下都会使用互斥锁。由于不太可能有可用的原子指令处理整个结构的原子load/store。
是Name._My_val.x, Name._My_val.y, Name._My_val.z
不是Name.x, Name.y, Name.z
为什么没有人告诉我这超出了我的范围,但无论如何。
出于某种原因似乎无法执行此操作(请参阅代码)。查看文档,似乎没有理由不工作...
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;
std::atomic<vector>
的实例不是 vector
的实例。它没有 x
、y
或 z
作为成员。它所拥有的(概念上的,内部的)是 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);
这里有 std::atomic<>
的文档 http://en.cppreference.com/w/cpp/atomic/atomic
std::atomic<>
.
std::atomic<X>
是一种类型,其中 整个 X 可以原子替换,而不是它的各个部分。
您可能想要的是互斥锁,因为对于像 name_snapshot
这样的结构,std::atomic 在任何情况下都会使用互斥锁。由于不太可能有可用的原子指令处理整个结构的原子load/store。
是Name._My_val.x, Name._My_val.y, Name._My_val.z
不是Name.x, Name.y, Name.z
为什么没有人告诉我这超出了我的范围,但无论如何。