c++ - 静态原子全局变量在线程之间具有不同的值
问题描述
我有一个问题,我在两个不同的 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。
提前感谢您的帮助,对于问题中的任何错误,我深表歉意。我对这个平台和编程很陌生。
解决方案
推荐阅读
- javascript - Firebase signInWithEmailAndPassword 在 Brave 浏览器上抛出 PERMISSION_DENIED
- .net - PayPal PayFlow Pro 身份验证失败
- r - 如何在 R 的“绘图”中仅显示特定行子集的图例?
- ruby-on-rails - 如何根据布尔属性选择数据库中的元素
- django - 对 Django 的条带安全问题
- imagemagick - imagemagick 像素颜色提取(强制 RGB)
- windows - 卸载注册表配置单元的 WinApi 调用是什么?
- php - 如何正确更改 Eloquent 模型上的日期格式?
- python - 带包的Python导入功能
- r - 如何生成窄ggplot图