-5

我有两个 C++ 类,objecManipupdater. 该updater课程有一个计时器来检查我的应用程序的机器人手臂的状态。

如果它在移动,则什么也不做,否则从动作队列中获取下一个动作()。

动作队列由 class 填充objectManip。我有一个全局变量:current_status我需要的机械臂objectManip

问题是,当填写动作队列时,current_status不是动态的。

4

1 回答 1

1

问题很不清楚,所以这确实是在黑暗中刺伤,但是您需要使用原子数据类型。使用 C++11,你有std::atomic(见这里这里。对于早期版本的 C++,我认为你需要使用一些库或编译器特定的数据类型,它提供原子数据类型。

如果您对多线程如何适用于您的 CPU 和操作系统做出一些假设,那么您可能只需声明共享变量volatile并在使用临时变量时读取值即可。volatile确实适用于读取硬件映射值之类的情况,其中每次都必须从内存中读取值,因此不可能进行很多优化。它本身并不能保证原子更新,因为修改值的线程可能会在更新过程中被中断,然后另一个读取可能会读取无效的、部分更新的值。对于布尔值,这应该是相当安全的。对于不跨越内存字边界和字长或更小的整数,这在许多 CPU 上可能是安全的,这不会在写入单个内存字的过程中中断线程。否则,就是等待发生的数据损坏。一些(今天不常见的)CPU 也不会在多个 CPU 内核之间同步缓存,在这种情况下volatile也无济于事,不同的线程可能会看到不同的缓存值。所以结论:使用volatile作为最后的黑客攻击!

于 2013-03-10T07:50:56.923 回答