gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:33 27 4
gpt4 key购买 nike

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

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

注意事项:

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

最佳答案

所以,天真的做法是不忙着 sleep ,例如:

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);
}

关于c++ - 让线程等待内存中值更改的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49481772/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com