c++ - 用不同版本编译的相同代码提供不同的结果

标签 c++ linux gcc

我正在使用一个我无法控制也不知道其内部结构的外部库(我们称之为专有回调)。

我知道我有一个名为回调的类,它有两个 bool 变量:

class callbacks : public proprietarycallbacks {
  bool a = false;
  bool b = false;
  virtual callbackHandler() {
    cout "callback received\n";
    b = true;
  }
}

然后我有另一个继承自回调类的类:

class MyObject : public callbacks {

  void test() {
    while (!b) {
      cout << "test " << a << " " << b << endl;
      usleep(100000);
    }
  }
}

此代码在两个不同的 linux 版本中正确编译,具有两个不同的 GCC 版本和 LIBC 版本。

在最近的一个(linux mint,GCC 5.4 LIBC 2.23)上,我运行应用程序,同时看到 cout,当回调被调用时,代码同时存在。

在较旧的版本(debian、GCC 4.9.2、LIBC 2.19)上,虽然从不存在,但变量始终为 false,即使我可以从回调内部看到打印。

是我构建代码的方式和变量继承有问题,还是与我使用的软件版本有关?

谢谢你的时间

最佳答案

从您的test() 方法可以明显看出涉及多个执行线程。 test() 在一个执行线程中,回调由另一个执行线程调用。

在另一个执行线程中设置 bool 标志,并在 test() 执行线程中读取相同的标志,彼此不按顺序排列。

通常的解决方案是使用std::atomic_bool;或使用 std::mutex 实现排序,并访问变量,或者在一个执行线程中设置它们,或者在另一个执行线程中读取它们的当前值,仅当互斥量被锁定时。

关于c++ - 用不同版本编译的相同代码提供不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41721040/

相关文章:

c++ - 如何使用 libpq 在 PostgreSQL 表中以二进制格式插入文本数组?

c++ - 为什么静态成员变量不能很好地与三元运算符一起使用?

linux - 创建 Bash 脚本来检查和禁用 SELinux : How to Prompt User Input?

c++ - gcc:通过显式 memcpy 避免严格别名违规警告

c - About Variable-Size Stack Frames,关于栈帧的对齐,来自CSAPP的一个例子

c++ - 从对象 vector 中释放内存(不是指向对象的指针)

c++ - 找不到为什么会出现错误

linux - 等待队列中的唤醒进程

linux - 如何编写循环遍历相似字符以执行函数的脚本?

c++ - 带有旧版本库的 MinGW