gpt4 book ai didi

c - futex 手册页演示结果不正确

转载 作者:行者123 更新时间:2023-11-30 14:32:54 25 4
gpt4 key购买 nike

futex man page提供了一个简单的演示,但我无法得到页面描述的结果,结果似乎在我的机器上死锁(linux 5.2.1);父进程不会被子进程唤醒。手册页是否错误?

我的机器上的输出示例:

[root@archlinux ~]# ./a.out
Child (12877) 0
Parent (12876) 0
Child (12877) 1
// block here

我的系统:

[root@archlinux ~]# uname -a
Linux archlinux 5.2.1-arch1-1-ARCH #1 SMP PREEMPT Sun Jul 14 14:52:52 UTC 2019 x86_64 GNU/Linux

最佳答案

事实上,手册页中的示例是错误的,在两个地方代码偏离了相应注释中的正确描述。

       /* Acquire the futex pointed to by 'futexp': wait for its value to
become 1, and then set the value to 0. */

static void
fwait(int *futexp)
{
int s;

/* atomic_compare_exchange_strong(ptr, oldval, newval)
atomically performs the equivalent of:

if (*ptr == *oldval)
*ptr = newval;

It returns true if the test yielded true and *ptr was updated. */

while (1) {

/* Is the futex available? */
const int zero = 0;
if (atomic_compare_exchange_strong(futexp, &zero, 1))
break; /* Yes */

必须反过来:

               /* Is the futex available? */
if (atomic_compare_exchange_strong(futexp, &(int){1}, 0))
break; /* Yes */
<小时/>
       /* Release the futex pointed to by 'futexp': if the futex currently
has the value 0, set its value to 1 and the wake any futex waiters,
so that if the peer is blocked in fpost(), it can proceed. */

static void
fpost(int *futexp)
{
int s;

/* atomic_compare_exchange_strong() was described in comments above */

const int one = 1;
if (atomic_compare_exchange_strong(futexp, &one, 0)) {

必须反过来:

           if (atomic_compare_exchange_strong(futexp, &(int){0}, 1)) {

关于c - futex 手册页演示结果不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59628958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com