C++ 投掷原子弹安全吗<;T>;托特
我有两个问题:C++ 投掷原子弹安全吗<;T>;托特,c++,atomic,futex,C++,Atomic,Futex,我有两个问题: 在一般情况下,将原子用作T并在它们之间互换切换是否安全 在futex的情况下,做演员是安全的吗 我知道对非原子类型执行原子操作是未定义的行为,但我找不到相反的答案。例如,这将按预期编译和执行: std::atomic_int foo = 5; int* bar = reinterpret_cast<int*>(&foo); (*bar)++; std::cout << (*bar) << std::endl; std::atomic_
std::atomic_int foo = 5;
int* bar = reinterpret_cast<int*>(&foo);
(*bar)++;
std::cout << (*bar) << std::endl;
std::atomic_int foo=5;
int*bar=reinterpret\u cast(&foo);
(*巴)++;
标准::cout
在一般情况下,将原子用作T并在它们之间互换切换是否安全
不能使用reinterpret\u cast
reinterpret_cast
仅在明确列出的情况下是安全的,而这不是一种
但是,您可以使用std::atomic_ref
将T
临时转换为原子对象
在futex的情况下,做演员是安全的吗
没有
但是,std::atomic_ref
具有与std::atomic
类似的API,包括wait
在一般情况下,将原子用作T并在它们之间互换切换是否安全
不能使用reinterpret\u cast
reinterpret_cast
仅在明确列出的情况下是安全的,而这不是一种
但是,您可以使用std::atomic_ref
将T
临时转换为原子对象
在futex的情况下,做演员是安全的吗
没有
然而,std::atomic_ref
有一个类似于std::atomic
的API,包括wait
看起来像是公然的UB。你没有找到相反答案的原因很简单:大多数人只是按照需要自动加载或存储一个常规的t值到原子t中。操作员T和操作员=是您的朋友。与引入未知行为的成本相比,堆叠T的成本通常很小。Re:(*bar)+
——这里的目标大概是实现非原子增量。如果可以接受,那么就使用非原子对象。如果你要绕过原子性,原子化是没有意义的。不,但是我见过一些专业的图书馆把C++原子和FuxEs混合在一起。它看起来仍然是明显的UB。你还没有找到相反答案的原因很简单:大多数人只是按照要求在原子t中加载或存储一个常规的t值。操作员T和操作员=是您的朋友。与引入未知行为的成本相比,堆叠T的成本通常很小。Re:(*bar)+
——这里的目标大概是实现非原子增量。如果可以接受,那么就使用非原子对象。如果你要绕过原子性,原子化是没有意义的。不,但是我见过一些专业的图书馆把C++原子和FuxEs混合在一起。它仍然是UB
std::atomic_int32_t val = 0;
syscall(SYS_futex, reinterpret_cast<int*>(&val), FUTEX_WAIT_PRIVATE, 0, nullptr);