2012-01-14 120 views

回答

0

参见手册页:http://ds9a.nl/futex-manpages/futex2.html,并让我们知道,如果有什么东西你仍然需要之后。我不确定你的问题的一件事是,你是否打算让另一个函数告诉这个值已经更新,或者你更喜欢使用超时。

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

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

如果你有兴趣了解更多关于如何正确使用futexes,我推荐Futexes Are Tricky论文。

相关问题