c++ - 当只有一个线程写入 c++ 中的 bool 变量时,是否可能出现竞争条件?

标签 c++ multithreading synchronization race-condition

在下面的代码示例中,程序执行永远不会结束。

它创建一个线程,该线程在终止之前等待全局 bool 设置为 true。只有一位作者和一位读者。我相信允许循环继续运行的唯一情况是 bool 变量为 false。

bool 变量怎么可能以与只有一个作者 不一致的状态结束?

#include <iostream>
#include <pthread.h>
#include <unistd.h>

bool done = false;

void * threadfunc1(void *) {
    std::cout << "t1:start" << std::endl;
    while(!done);
    std::cout << "t1:done" << std::endl;

    return NULL;
}

int main()
{
    pthread_t threads;

    pthread_create(&threads, NULL, threadfunc1, NULL);

    sleep(1);

    done = true;
    std::cout << "done set to true" << std::endl;

    pthread_exit(NULL);

    return 0;
}

最佳答案

从某种意义上说,threadfunc1() 中的这条语句存在问题:

   while(!done);

可以由编译器实现为:

       a_register = done;
   label:
       if (a_register == 0) goto label;

因此永远不会看到对done 的更新。

关于c++ - 当只有一个线程写入 c++ 中的 bool 变量时,是否可能出现竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21183261/

相关文章:

python - 所有线程均未与QThread以及QtSerialPort(对于Arduino)和Matplotlib一起运行

core-data - RestKit 和 Core Data - 如何 POST 数据?

c++ - 是否有任何 std::set 实现不使用红黑树?

c++ - Qt:强制QWebView点击一个网络元素,即使是在窗口上不可见的元素

c++ - 具有相关名称的 OpenGL 综合颜色列表

java - 如何在访问 java ArrayList 时阻止两个线程冲突?

java - 为什么在Java中设计单例模式时需要双重检查锁?

c++ - 在存储可以用不同派生类型初始化的基类型成员变量时避免使用 new

linux - uClibc 共享库在 exit() 期间卸载

python - 如何在我的代码上使用多处理/多线程?