我正在使用一个我无法控制的外部库,也不知道内部(我们称之为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永远不存在,变量总是假的,即使我可以从回调中看到打印。
我构造代码的方式和变量继承有什么问题,或者这与我正在使用的软件版本有关吗?
感谢您的时间
答案 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
来实现排序和访问变量,或者将它们设置在一个执行线程中,或者只在互斥锁被锁定时才读取其他执行线程中的当前值。