我将如何使用futex实现此方法
How would I implement this method using a 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
中可能并发的线程数等)
如果你有兴趣了解更多关于如何正确使用蒲团的知识,我推荐《蒲团很狡猾》这篇论文。
相关文章:
- 如何实现此伪代码?
- 如何缩短此方法签名?
- CMake + Qt,moc 编译失败,无法实现 QMetaObject 方法(编译器找不到基本 ui 对象的标头?
- 它叫什么以及如何实现此行为?
- 将非类库分离为标头和实现的方法
- 错误"pure virtual method called",当此方法已被覆盖时
- 调用没有主体的未实现静态方法
- 实现此自定义priority_queue的正确方法是什么
- C++:为什么此方法每次都返回相同的随机数?
- 是否可以简化此方法以安装和导出基于 CMake 的项目?
- 使用抽象类的类和实现此抽象类的创建对象
- enable_if在类声明之外实现的方法专用化
- 实现虚拟方法的组合行为
- 实现此"on error, throw"回调的最佳方法是什么?
- 在C 11或更高版本中,是否可以通过Lambda来实现单方法纯Virtual C 接口
- 我写了此方法来删除链接列表的重复元素,但它显示了分段故障,原因
- C++ 字符串 - 如何为 wstring 实现此'IsEmptyOrSpace(string)'方法?
- 我将如何使用futex实现此方法
- c++:实现equal方法-如何确保给定的对象与此对象不是同一个引用
- 是否有像WaitNamedPipe这样的函数或在c++ /linux上实现此功能的方法?(因此进程不会在管道上阻塞无限时