繁体   English   中英

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

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

假设有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或exchange语句时会遇到什么麻烦?
  • 是否可能在读取或写入flag时发生任何麻烦,例如memory问题?
  • 在具有任何CPU架构的任何平台上,它绝对安全吗? 我的意思是(可移植的代码)。 因为在某些X86体系结构中不需要atomic<bool>

我只是想使用atomic特性而不是mutex

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

当将operator==std::atomic<T>T ,它将首先使用最强的内存排序std::memory_order_seq_cst调用atomic<T>::operator T()load原子值。 接下来,使用operator==(T, T) 此序列不是原子的。 这意味着,当实际进行比较时, std::atomic<T>可能已经更改。

只是想使用原子特性而不是mutex

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM