我有两个 C++ 类,objecManip
和updater
. 该updater
课程有一个计时器来检查我的应用程序的机器人手臂的状态。
如果它在移动,则什么也不做,否则从动作队列中获取下一个动作()。
动作队列由 class 填充objectManip
。我有一个全局变量:current_status
我需要的机械臂objectManip
。
问题是,当填写动作队列时,current_status
不是动态的。
问题很不清楚,所以这确实是在黑暗中刺伤,但是您需要使用原子数据类型。使用 C++11,你有std::atomic
(见这里或这里。对于早期版本的 C++,我认为你需要使用一些库或编译器特定的数据类型,它提供原子数据类型。
如果您对多线程如何适用于您的 CPU 和操作系统做出一些假设,那么您可能只需声明共享变量volatile
并在使用临时变量时读取值即可。volatile
确实适用于读取硬件映射值之类的情况,其中每次都必须从内存中读取值,因此不可能进行很多优化。它本身并不能保证原子更新,因为修改值的线程可能会在更新过程中被中断,然后另一个读取可能会读取无效的、部分更新的值。对于布尔值,这应该是相当安全的。对于不跨越内存字边界和字长或更小的整数,这在许多 CPU 上可能是安全的,这不会在写入单个内存字的过程中中断线程。否则,就是等待发生的数据损坏。一些(今天不常见的)CPU 也不会在多个 CPU 内核之间同步缓存,在这种情况下volatile
也无济于事,不同的线程可能会看到不同的缓存值。所以结论:使用volatile
作为最后的黑客攻击!