我有两个问题:
- 在一般情况下,使用原子作为T并在它们之间互换切换是安全的吗?
- 在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
。