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

标签 c++ c++11

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

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

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<>不像普通的数据类型是自由竞争,但我想确定这些:

  • 使用==会有什么问题吗? , assignment , read/write而不是(例如)std::atomic_load或交换声明?
  • 有没有可能发生什么问题,比如memory读取或写入 flag 时出现问题?
  • 它在具有任何 CPU 架构的任何平台上都绝对安全吗?我的意思是(一个可移植的代码)。因为atomic<bool>在某些 X86 架构中不需要?

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

最佳答案

will be any trouble when using of ==, assignment, read/write instead of (for example) std::atomic_load or exchange statements?

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

just wanna use of atomic feature instead of mutex.

您可以使用 std::atomic::compare_exchange_weak 实现带有原子的自旋锁(有一个例子),但它不能像std::mutex那样让线程进入休眠状态。

关于c++ - 在 C++ 中对 std::atomic<bool> 使用比较和读/写操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49225302/

相关文章:

c++ - 多线程减慢程序 : no False-sharing, 没有互斥锁,没有缓存未命中,工作量不小

java - C++和Java之间如何压缩和解压?

c++ - 为什么这个函数不调用移动构造函数?

c++ - 通过构造函数和析构函数实现 RAII 是否被认为是错误的 'Modern C++'?

c++11 - 使用forward_as_tuple发送初始化列表

c++ - "trailing parameter pack"到底是什么

c++ - 无法在我的字符串中找到准确数量的以标点符号(如引号)开头的单词

c++ - 将类函数指针传递给另一个类

c++ - 错误 C3892: 'std::_Tree_unchecked_const_iterator

c++ - 一次只能操纵一个 union 成员是什么意思?