C++ 如何使用futex实现此方法?

C++ 如何使用futex实现此方法?,c++,futex,C++,Futex,此方法(我知道函数可能需要一些额外的参数): 请参阅手册页:然后让我们知道在那之后您是否还需要什么。从您的问题中,我不确定的一点是,您是否打算使用另一个函数通知此函数值已更新,或者您是否喜欢使用超时。我对futexes的使用非常陌生,但我认为这是一个可行的解决方案。请注意,我根本没有测试过它,如果再做一些调整,它可能会变得更快 void waitUntilNotEqual(volatile int* addr, int value) { while (*addr == value) {

此方法(我知道函数可能需要一些额外的参数):


请参阅手册页:然后让我们知道在那之后您是否还需要什么。从您的问题中,我不确定的一点是,您是否打算使用另一个函数通知此函数值已更新,或者您是否喜欢使用超时。

我对futexes的使用非常陌生,但我认为这是一个可行的解决方案。请注意,我根本没有测试过它,如果再做一些调整,它可能会变得更快

void waitUntilNotEqual(volatile int* addr, int value) {
  while (*addr == value) {
    futex(addr, FUTEX_WAIT, value, 0, 0, 0);
  }
}

void changeValue (volatile int* addr, int newValue) {
  int oldValue = *addr;
  if (oldValue != newValue) {
    *addr = newValue;
    futex(addr, FUTEX_WAKE, INT_MAX, 0, 0, 0);
  }
}
为了使其正常工作,对传递给
waituntinotequal
的地址的所有修改都应通过
changeValue
完成。
FUTEX\u WAKE
调用中的
INT\u MAX
值指示它应该唤醒等待此FUTEX的所有线程。
changeValue
函数中的if语句是一种优化,可避免无意义的唤醒。最后,
FUTEX\u WAIT
调用需要保持在一个循环中,因为它可能会从信号中错误返回

我还应该指出,您没有给出关于您试图解决的问题的太多细节,这意味着这段代码可能只适用于最简单的用例。如果您想要更好地适应当前问题,那么我需要更多详细信息(线程数、调用
waitUntilNotEqual
changeValue
的上下文、
waitUntilNotEqual
changeValue
中可能并发的线程数等)

如果你有兴趣学习更多关于如何正确使用Futex的知识,我推荐这篇论文

void waitUntilNotEqual(volatile int* addr, int value) {
  while (*addr == value) {
    futex(addr, FUTEX_WAIT, value, 0, 0, 0);
  }
}

void changeValue (volatile int* addr, int newValue) {
  int oldValue = *addr;
  if (oldValue != newValue) {
    *addr = newValue;
    futex(addr, FUTEX_WAKE, INT_MAX, 0, 0, 0);
  }
}