首页 > 解决方案 > 静态原子全局变量在线程之间具有不同的值

问题描述

我有一个问题,我在两个不同的 C++ 类中有两个线程,一个读取一个原子 bool,一个更改它。我在一个单独的头文件中定义了它,它包含在两个类文件中。

    static std::atomic<bool> readyToRead;

一个类启动一个线程来改变readyToRead的值,这个函数被传递给那个线程:

void WhiteBoard::writePoint(int x, int y) {
    QMutex mutex1;
    bool binX[16];
    bool binY[16];
    for(int i = 0; i <= 15; i++){
        binX[i]=x%2;
        x/=2;
    }

    for(int i = 0; i <= 15; i++){
        binY[i]=y%2;
        y/=2;
    }

    if(readyToWrite){
        mutex1.lock();
        memcpy(GPIOX, binX, sizeof(binX));
        memcpy(GPIOY, binY, sizeof(binY));
        readyToRead = 1;
        mutex1.unlock();
    }

    qDebug() << "T: " << readyToRead;
}

另一个类也有一个运行这个函数的线程:

void DisplayBoard::readPoint() {
    valChanged = 0;
    QMutex mutex2;
    int x = 0;
    int y = 0;
    bool binX[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    bool binY[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    while(1){
        qDebug() << "R: " << readyToRead;

        if(readyToRead){
            mutex2.lock();
            memcpy(binX, GPIOX, sizeof(binX));
            memcpy(binX, GPIOY, sizeof(binY));
            qDebug() << GPIOX[0];;
            mutex2.unlock();
            valChanged = 1;
        }

        for(int i = 0; i <= 15; i++){
            int b = 1;
            x = x + binX[i] * b;
            b *= 2;
        }

        for(int j = 0; j <= 15; j++){
            int b = 1;
            y = y + binY[j] * b;
            b *= 2;
        }

        point.setX(x);
        point.setY(y);


    }

}

我想要代码做的是在第二个线程中运行 if 语句中的代码,当第一个线程更改 readyToRead 的值时。readyToWrite、GPIOX 和 GPIOY 都是全局变量,其中 readyToWrite 也是原子的,在线程启动前设置为 1。但是,即使我可以看到 readyToRead 的值在第一个线程中已更改为 true,但在第二个线程中仍为 false。

提前感谢您的帮助,对于问题中的任何错误,我深表歉意。我对这个平台和编程很陌生。

标签: c++multithreadingqt

解决方案


推荐阅读