当前位置: 首页 > 知识库问答 >
问题:

std::原子bool变量的访问顺序

谷玉韵
2023-03-14
// somewhere member var 'executing' is defined as std::atomic<bool>`

int A::something(){
    
    int result = 0;
    // my intention is only one thread should enter next block
    // others should just return 0
    if(!executing){
        executing = true;

        ...
        // do some really long processing
        ...
       
        result    = processed;
        executing = false;
    }
    
    return result;
}

>

  • 两个相互冲突的评估都是原子操作(请参见STD::atomic)

    其中一个冲突的评估发生在另一个之前(请参见STD::MEMORY_ORDER)

    如果发生数据争用,程序的行为是未定义的。

  • 共有1个答案

    益思博
    2023-03-14

    如果我理解正确的话,您试图确保只有一个线程将在同一时间执行一段代码。这正是互斥体所做的。既然您提到如果互斥体不可用,您不希望线程阻塞,那么您可能希望查看std::mutextry_lock()方法。请参见STD::Mutex的文档。

    现在要解释为什么代码不能按预期工作:稍微简化一下,STD::Atomic保证在并发访问变量时不会出现数据竞争。即。有一个定义良好的读写顺序。这对你想做的事情来说是不够的。想象一下if分支:

    if(!executing) {
       executing = true;
    

    请记住,只有在上执行的读写操作是原子操作。这至少使否定if本身不同步。对于两个线程,执行顺序可以如下所示:

      null
    std::mutex myMutex;
    
    int A::something(){
    
        int result = 0;
        // my intention is only one thread should enter next block
        // others should just return 0
        if(myMutex.try_lock()){
    
            ...
            // do some really long processing
            ...
    
            result    = processed;
            myMutex.unlock();
        }
    
        return result;
    }
    
     类似资料:
    • 关于如何处理原子,以及如何处理std::condition\u变量,有几个问题。但我的问题是,我下面的用法是否正确? 三个线程,一个ctrl线程,在取消暂停其他两个线程之前执行准备工作。ctrl线程还能够在工作线程(发送方/接收方)处于紧密的发送/接收循环时暂停它们。使用原子的想法是在没有设置暂停布尔值的情况下,使紧循环更快。

    • 问题内容: 如果长变量声明为:- 私有易失性长计数器= 0; 现在,如果我使用预增量运算符对其进行增量,那么该操作将是原子的吗? 如果是,那么它将比对象的增量效率更高吗? 问题答案: 关键字只能解决可见性问题。您必须使用或方法/块来实现原子性(并发编程中的原子性)。 今天又发表了一篇文章:演示何时需要挥发物

    • 问题内容: 得知子类的类变量无法访问父类的类变量而没有特别指出父类的名称,我感到很惊讶: 为什么在定义By时我必须引用Ax,而不仅仅是x?这与我对实例变量的直觉是相反的,并且因为在定义B之后我可以引用Bx。 问题答案: 在Python中,在创建类之前,将在其自己的名称空间中执行类的主体(此后,该名称空间的成员将成为该类的成员)。因此,当解释器达到y = x + 1时,此时B类尚不存在,因此没有父类

    • 问题内容: 在Objective-C中,您可以区分原子性质和非原子性质: 根据我的理解,您可以安全地从多个线程读取和写入定义为原子的属性,而同时从多个线程中写入和访问非原子属性或ivars可能导致不确定的行为,包括严重的访问错误。 因此,如果您在Swift中有这样的变量: 我可以安全地并行读写该变量吗?(不考虑这样做的实际含义)。 问题答案: 假设尚无底层文档,这还为时尚早,但是您可以从汇编中学习

    • 我的子类是,我需要在我的超类中使用字段和。我知道如何在子类中使用超类变量,但我必须学会如何做相反的事情?谢谢。

    • The order in which request variables are registered, similar to variables_order in php.ini 请求变量的顺序在这里配置,类似于php.ini中的变量顺序.