在 c++ 中使用 std::atomic 的比较和读/写操作<bool>?

Using compare and read/write operations for std::atomic<bool> in c++?

本文关键字:操作 lt gt bool c++ std 比较 atomic      更新时间:2023-10-16

假设有2线程作为threadAthreadB,我们将在这些threads中使用std::atomic<bool>数据类型。所以现在我们有一些关键部分如下:

我的全局变量(线程同时访问它(:

std::atomic<bool> flag;

线程 A :

void *threadA(void *arg)
{
    bool ttt = true;
    if(flag == true)                   // comparison operator ==
        // do something
    // something to do
    flag = false;                      // assign a avalue
    ttt = flag;                        // read operation
    return 0;
}

线程 B :

void *threadB(void *arg)
{
    bool m = true;
    if(flag == true)                   // comparison operator ==
        flag = false;
    // something to do
    flag = true;                       // assign a value
    m = !flag;                         // read operation
    return 0;
}

无论如何,我知道std::atomic<>与普通数据类型不同是自由竞赛的,但我想确定这些:

  • 使用==assignmentread/write代替(例如(std::atomic_load或交换报表时会有什么麻烦吗?
  • 是否有可能发生任何麻烦,例如在读取或写入flag时出现memory问题?
  • 在任何具有任何CPU架构的平台上是否绝对安全?我的意思是(便携式代码(。因为在某些 X86 架构中不需要atomic<bool>

我只想使用atomic功能而不是mutex.

使用 ==assignmentread/write 而不是(例如(std::atomic_loadexchange语句时会有什么麻烦吗?

operator==std::atomic<T>T一起使用时,它首先调用atomic<T>::operator T()来使用最强的内存排序std::memory_order_seq_cstload原子值。接下来,使用operator==(T, T)。此序列不是原子序列。这意味着当比较实际发生时,std::atomic<T>可能已经发生了变化。

只想使用原子特征而不是mutex.

您可以使用 std::atomic::compare_exchange_weak(有一个示例(实现带有原子的旋转锁,但它无法像std::mutex那样使线程进入睡眠状态。