将原子转换为 T 是否安全<T>



我有两个问题:

  1. 在一般情况下,使用原子作为T并在它们之间互换切换是安全的吗?
  2. 在futex的情况下,做铸造是安全的吗?

我知道对非原子类型执行原子操作是未定义的行为,但我找不到相反的答案。例如,下面的命令按预期编译和执行:

std::atomic_int foo = 5;
int* bar = reinterpret_cast<int*>(&foo);
(*bar)++;
std::cout << (*bar) << std::endl;
关于第二个问题,Linux手册说在FUTEX_WAIT操作

futex字的值是一个原子存储器访问(即:使用原子机器的各自指令体系结构)。这个负荷,与之比较执行期望值,并开始睡眠相对于其他燃料,原子和完全有序对同一个futex字的操作。

那么下面的代码安全吗?

std::atomic_int32_t val = 0;
syscall(SYS_futex, reinterpret_cast<int*>(&val), FUTEX_WAIT_PRIVATE, 0, nullptr);

在一般情况下,使用原子作为T并在它们之间互换是安全的吗?

reinterpret_cast无关。reinterpret_cast只有在明确列出的情况下才是安全的,而这不是。

你可以用std::atomic_ref暂时把T变成一个原子对象。

在futex的情况下,做cast是安全的吗?

然而,std::atomic_ref有一个类似于std::atomic的API,包括wait

最新更新