我想唤醒所有在 futex 上休眠的线程。我对
man futex
页面中的不一致感到困惑。
具体来说,该页面显示
val
的类型为 uint32_t
。随后,在 FUTEX_WAKE
部分,页面显示要唤醒所有线程,请将 INT_MAX
传递给 val
。
INT_MAX
适用于有符号整数,而不适用于无符号整数。我希望能通过UINT32_MAX
。尽管我也可以预见到 val
变量可重用于不同的事物,因此 INT_MAX
仍然是正确的选项,因为 val
在内核中被强制转换为 int。
正确的做法是什么?
我检查了内核代码,将
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
是用于唤醒所有线程的正确值。