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_

我有两个问题:

  • 在一般情况下,将原子用作T并在它们之间互换切换是否安全
  • 在futex的情况下,做演员是安全的吗
  • 我知道对非原子类型执行原子操作是未定义的行为,但我找不到相反的答案。例如,这将按预期编译和执行:

    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);