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