让线程等待内存中的值更改的有效方法?

ein*_*ica 5 c++ linux multithreading synchronization c++11

由于某些愚蠢的原因,我的(GNU/Linux)机器上有一个硬件只能通过将值写入内存来传达特定的事件。假设通过某种魔法,硬件写入的内存区域对于我正在运行的进程是可见的。现在,我想让该进程中的一个线程跟踪该值,并在它发生更改后尽快执行一些代码。然而,对我来说,更重要的是线程不浪费 CPU 时间,而不是绝对最小化响应延迟。所以 - 无需忙于等待不稳定的...

我应该如何最好地做到这一点(使用现代 C++)?

笔记:

  • 我不介意涉及原子或同步机制的解决方案(事实上,这可能更好) - 只要您记住硬件不支持主机内存上的原子操作 - 它执行普通写入。
  • 硬件写入的值可以是我喜欢任何值,它写入的内存位置中的初始值也可以是我喜欢的值。
  • 我使用 C++11,因为它是现代 C++ 的流行标签,但实际上,C++14 很棒,C++17 也不错。另一方面,即使是基于 C 的解决方案也可以。

ein*_*ica 1

因此,天真的做法是不忙着睡觉,例如:

volatile int32_t* special_location = get_special_location();
auto polling_interval_in_usec = perform_tradeoff_between_accuracy_and_cpu_load();
auto polling_interval = std::chrono::microseconds(polling_interval_in_usec);

while(should_continue_polling()) {
    if (*special_location == HardwareIsDone) { 
         do_stuff();
         return;
    }
    std::this_thread::sleep_for(polling_interval); 
}
Run Code Online (Sandbox Code Playgroud)