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

How would I implement this method using a futex?

本文关键字:实现 此方法 futex 何使用      更新时间:2023-10-16

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

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

请参阅手册页:http://ds9a.nl/futex-manpages/futex2.html如果在那之后你还需要什么,请告诉我们。从你的问题中,有一件事我不确定,那就是你是否打算使用另一个函数来通知这个函数值已经更新,或者你是否更喜欢使用超时。

我对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完成。FUTEX_WAKE调用中的INT_MAX值表示它应该唤醒所有等待该futex的线程。changeValue函数中的if语句是一种优化,可以避免无意义的唤醒。最后,FUTEX_WAIT调用需要保持在一个循环中,因为它可能会从信号中错误返回。

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

如果你有兴趣了解更多关于如何正确使用蒲团的知识,我推荐《蒲团很狡猾》这篇论文。