繁体   English   中英

使用不同版本编译的相同代码提供不同的结果

[英]Same code compiled with different versions provides different result

我正在使用一个我无法控制的外部库,也不知道内部(我们称之为privcallbacks)。

我知道我有一个名为callbacks的类,它有两个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)中,我运行应用程序,在while中查看cout,当调用回调时,代码存在于while。

在旧的(debian,GCC 4.9.2,LIBC 2.19)中,while永远不存在,变量总是假的,即使我可以从回调内部看到打印。

我构造代码的方式和变量继承有什么问题,或者这与我使用的软件版本有什么关系?

感谢您的时间

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM