这种方法(我实现的功能可能需要一些额外的参数):如何使用futex实现此方法?
void waitUntilNotEqual(volatile int* addr, int value)
{
while (*addr == value) {}
}
这种方法(我实现的功能可能需要一些额外的参数):如何使用futex实现此方法?
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
调用需要保持循环,因为它可能会从信号中虚假地返回。
我还应该指出,你没有给出关于你试图解决的问题的很多细节,这意味着这段代码可能只适用于最简单的用例。如果你想要的东西更好地适应当前的问题,那么我需要更多的细节(线程上下文中waitUntilNotEqual
和changeValue
被调用时,可能并发线程数的数量waitUntilNotEqual
或changeValue
等)
如果你有兴趣了解更多关于如何正确使用futexes,我推荐Futexes Are Tricky论文。