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

时间:2017-01-18 13:43:19

标签: c++ linux gcc

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

我知道我有一个名为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,当调用回调时,代码存在了。

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

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

感谢您的时间

1 个答案:

答案 0 :(得分:0)

var currentRoutePage = require('vues/page' + routeName + '.vue'); new Vue({ el: '#app', render: function (createElement) { return createElement(currentRoutePage); } }); 方法可以明显看出,涉及多个执行线程。 test()在一个执行线程中,并且回调由另一个执行线程调用。

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

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