加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 什么是`FUTEX_REQUEUE`错误?

发布时间:2020-12-14 01:43:31 所属栏目:Linux 来源:网络整理
导读:我将 Linux FUTEX(2) 手册页分配为操作系统类中所需的读取,以警告学生在设计同步原语时不要自满. futex()系统调用是Linux提供的API,允许用户级线程同步原语在必要时休眠和唤醒.手册页描述了可以使用futex()系统调用调用的5种不同操作.两个基本操作是FUTEX_WA
我将 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互斥锁:

They are much more complex because they support many more features,such as testing for deadlock,and recursive locking. Due to this,they have an internal lock protecting the extra state. This extra lock means that they cannot use the FUTEX_REQUEUE multiplex function due to a possible race.

资料来源:http://locklessinc.com/articles/futex_cheat_sheet/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读