Linux futex系统调用虚假唤醒,返回值为0?

Linux futex系统调用虚假唤醒,返回值为0?,第1张

概述我遇到了Linux futex系统调用(FUTEX_WAIT *** 作)的问题,有时候看似无故返回.文档指定了可能导致它提前返回的某些条件(没有FUTEX_WAKE)但这些都涉及非零返回值:如果futex地址处的值不匹配则为EAGAIN,ETIMEDOUT用于定时等待超时,EINTR在被中断时a(非重启)信号等.但是我看到返回值为0.除了FUTEX_WAKE或者s

我遇到了Linux futex系统调用(FUTEX_WAIT *** 作)的问题,有时候看似无故返回.文档指定了可能导致它提前返回的某些条件(没有FUTEX_WAKE)但这些都涉及非零返回值:如果futex地址处的值不匹配则为EAGAIN,ETIMEDOUT用于定时等待超时,EINTR在被中断时a(非重启)信号等.但是我看到返回值为0.除了FUTEX_WAKE或者set_tID_address指针指向futex的线程终止之外,还可能导致FUTEX_WAIT以返回值返回0?

如果它有用,我正在等待的特定futex是线程tID地址(由克隆系统调用CLONE_CHILD_CLEARTID设置),并且线程没有终止.我的(显然不正确)假设FUTEX_WAIT *** 作返回0只能在线程终止导致程序逻辑出现严重错误时发生,我已经通过循环和重试来修复,即使它返回0,但现在我很好奇它发生的原因.

这是一个最小的测试用例:

#define _GNU_SOURCE#include 

让它运行一段时间,它应该最终以Killed(SIGKILL)终止,这只有在FUTEX_WAIT返回时线程仍然存在时才有可能.

在任何人开始假设这只是内核在完成销毁线程之前唤醒futex(实际上这可能发生在我的最小测试用例中),请注意在我的原始代码中,我实际观察到在线程中运行的用户空间代码好在FUTEX_WAIT返回后.

最佳答案您是否可以处理父母或子女作业是否先完成之间的竞争状况?您可以通过在foo()的开头或克隆()之后立即进行小睡眠来调查此理论,以确定事件的强制排序是否掩盖了问题.我不建议以这种方式修改任何东西,但它可能有助于调查.也许futex还没准备好等待孩子进一步完成初始化,但是父母的克隆有足够的时间返回给调用者?

具体来说,CLONE_VFORK选项的出现似乎意味着这是一个危险的场景.您可能需要一种双向信号机制,以便孩子向父母发出信号,告知其已经足够远以至于等待孩子是安全的.

总结

以上是内存溢出为你收集整理的Linux futex系统调用虚假唤醒,返回值为0?全部内容,希望文章能够帮你解决Linux futex系统调用虚假唤醒,返回值为0?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1048512.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)