linux – 什么是`FUTEX_REQUEUE`错误?
我将
Linux
FUTEX(2) 手册页分配为操作系统类中所需的读取,以警告学生在设计同步原语时不要自满.
futex()系统调用是Linux提供的API,允许用户级线程同步原语在必要时休眠和唤醒.手册页描述了可以使用futex()系统调用调用的5种不同操作.两个基本操作是FUTEX_WAIT(线程在尝试获取同步对象并且某人已经持有它时将其自身置于休眠状态)和FUTEX_WAKE(线程在释放同步时用于唤醒任何等待线程的操作)宾语.) 接下来的三个操作是有趣的开始.手册页描述如下: FUTEX_FD (present up to and including Linux 2.6.25) [...] Because it was inherently racy,FUTEX_FD has been removed from Linux 2.6.26 onward. 论文“Futexes are Tricky” by Ulrich Dreper,2004描述了竞争条件(这是一种潜在的错过唤醒).但还有更多: FUTEX_REQUEUE (since Linux 2.5.70) This operation was introduced in order to avoid a "thundering herd" effect when FUTEX_WAKE is used and all processes woken up need to acquire another futex. [...] FUTEX_CMP_REQUEUE (since Linux 2.6.7) There was a race in the intended use of FUTEX_REQUEUE,so FUTEX_CMP_REQUEUE was introduced. [...] FUTEX_REQUEUE中的比赛是什么? Ulrich的论文甚至没有提到它(本文描述了一个使用FUTEX_CMP_REQUEUE但不是FUTEX_REQUEUE操作实现的函数futex_requeue()). 解决方法
看起来竞争条件是由于glibc中互斥体的实现以及它们与futexes的差异.似乎需要FUTEX_CMP_REQUEUE来支持更复杂的glibc互斥锁:
资料来源:http://locklessinc.com/articles/futex_cheat_sheet/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |