唤醒所有在futex上休眠的线程

问题描述 投票:0回答:1

我想唤醒所有在 futex 上休眠的线程。我对

man futex
页面中的不一致感到困惑。

具体来说,该页面显示

val
的类型为
uint32_t
。随后,在
FUTEX_WAKE
部分,页面显示要唤醒所有线程,请将
INT_MAX
传递给
val

INT_MAX
适用于有符号整数,而不适用于无符号整数。我希望能通过
UINT32_MAX
。尽管我也可以预见到
val
变量可重用于不同的事物,因此
INT_MAX
仍然是正确的选项,因为
val
在内核中被强制转换为 int。

正确的做法是什么?

c linux synchronization system-calls futex
1个回答
0
投票

我检查了内核代码,将

INT_MAX
传递给
val
是正确的。内核将
val
转换为有符号整数。具体来说,
do_futex()
中的
kernel/syscalls/futex.c
val
传递到
futex_wake()
中的
kernel/futex/waitwake.c
val
通过
int nr_wake
中的
futex_wake()
参数传递,因此
val
隐式转换为
int

因此,为

FUTEX_WAIT
传递的计数被视为有符号整数,因此
INT_MAX
是用于唤醒所有线程的正确值。

© www.soinside.com 2019 - 2024. All rights reserved.