1

我有两个问题:

  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 字上的其他 futex 操作,该加载、与期望值的比较以及开始睡眠是原子地且完全有序地执行的。

那么下面的代码安全吗?

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

1 回答 1

3

在一般情况下,将原子用作 T 并在它们之间互换是否安全?

不与reinterpret_cast. reinterpret_cast只有在明确列出的情况下才是安全的,这不是一个。

但是,您可以使用 将 aT临时转换为原子对象std::atomic_ref

在 futex 的情况下,做演员表是否安全?

不。

但是,std::atomic_ref具有与 类似的 API std::atomic,包括wait.

于 2021-02-20T17:16:45.227 回答