我如何使用futex实现此方法?

时间:2012-01-14 15:44:11

标签: c++ futex

这个方法(我意识到函数可能需要一些额外的参数):

void waitUntilNotEqual(volatile int* addr, int value)
{
    while (*addr == value) {}
}

2 个答案:

答案 0 :(得分:0)

请参阅手册页:http://ds9a.nl/futex-manpages/futex2.html并告知我们之后是否仍有需要的内容。我不确定你的问题的一件事是你是否打算让另一个函数通知这个函数值已被更新,或者你是否愿意使用超时。

答案 1 :(得分:0)

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

为了使其正常工作,传递给waitUntilNotEqual的地址的所有修改都应通过changeValue完成。 INT_MAX调用中的FUTEX_WAKE值表示它应该唤醒等待此futex的所有线程。 changeValue函数中的if语句是一种避免无意义唤醒的优化。最后,FUTEX_WAIT调用需要保持循环,因为它可能会从信号中虚假地返回。

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

如果您有兴趣了解有关如何正确使用futex的更多信息,我建议使用Futexes Are Tricky论文。