这是似乎属于“天真明显但可能是错误的”类别的问题之一。当然,我正在努力寻找一种适用于所有极端情况的解决方案。看来这一定是一直遇到的问题。
我有一个“硬件”线程和一个“处理”线程。
硬件线程在我无权访问的封闭二进制库中运行。
处理线程向硬件线程注册回调,以通知与硬件状态更改相关的某些(罕见)事件。
我希望能够通知处理线程中的事件循环状态已更改。我想这样做而不需要依赖外部库或以不可移植的方式,也不需要使用锁(因为我不知道硬件线程何时可能想要再次通知处理线程)。
所以,我目前关于如何解决这个问题的想法如下:
#include <signal.h>
// sig_atomic_t is used so update is always in a sane state
static volatile sig_atomic_t update = 0;
// called from hardware thread
int callback_function() {
update += 1;
}
// called regularly from processing thread
int processing_function() {
static sig_atomic_t local_update = 0; // The same type as update
if (local_update != update){
update_internal_hardware_state(); // We necessarily call once per callback
local_update += 1;
}
}
update很明显,如果曾经环绕并且恰好达到local_updatebefore processing_functionis next 调用的值(尽管几乎可以肯定我可以假设这永远不会发生),这将打破。
我在这里错过了一些微妙(或不那么微妙)的东西吗?
有没有更好的方法来解决整个问题?
可以假设回调只从一个线程(硬件线程)调用。