3Msphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/userspace-api/futex2modnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/zh_TW/userspace-api/futex2modnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/it_IT/userspace-api/futex2modnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/ja_JP/userspace-api/futex2modnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/ko_KR/userspace-api/futex2modnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/sp_SP/userspace-api/futex2modnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhU/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/userspace-api/futex2.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h'Documentation/userspace-api/futex2.rst h]h)}(h&Documentation/userspace-api/futex2.rsth]h&Documentation/userspace-api/futex2.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhKubh)}(h李睿 Rui Li h]h)}(h李睿 Rui Li h](h李睿 Rui Li <}(hj hhhNhNubh reference)}(h me@lirui.orgh]h me@lirui.org}(hj*hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:me@lirui.orguh1j(hj ubh>}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(hfutex2h]hfutex2}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjXhhhhhK ubh)}(hhh]h)}(hhh](h)}(h作者h]h作者}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhhhKubh)}(h+André Almeida h]h)}(h*André Almeida h](hAndré Almeida <}(hjhhhNhNubj))}(handrealmeid@collabora.comh]handrealmeid@collabora.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refuri mailto:andrealmeid@collabora.comuh1j(hjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjnubeh}(h]h ]h"]h$]h&]uh1hhhhKhjkhhubah}(h]h ]h"]h$]h&]uh1hhjXhhhhhKubh)}(hX#futex,或者称为快速用户互斥锁(fast user mutex),是一组允许用户空间创建高性能同步 机制的系统调用,比如用户空间中的互斥锁,信号量和条件变量。C标准库,如glibc,使用它作 为实现更多高级接口的方式,如pthreads。h]hX#futex,或者称为快速用户互斥锁(fast user mutex),是一组允许用户空间创建高性能同步 机制的系统调用,比如用户空间中的互斥锁,信号量和条件变量。C标准库,如glibc,使用它作 为实现更多高级接口的方式,如pthreads。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjXhhubh)}(hVfutex2是初代futex系统调用的后续版本,旨在克服原有接口的限制。h]hVfutex2是初代futex系统调用的后续版本,旨在克服原有接口的限制。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjXhhubjW)}(hhh](j\)}(h 用户APIh]h 用户API}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjhhhhhKubjW)}(hhh](j\)}(h``futex_waitv()``h]hliteral)}(hjh]h futex_waitv()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1j[hjhhhhhKubh)}(h:等待一个futex数组,可由其中任意一个唤醒::h]h9等待一个futex数组,可由其中任意一个唤醒:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh literal_block)}(hfutex_waitv(struct futex_waitv *waiters, unsigned int nr_futexes, unsigned int flags, struct timespec *timeout, clockid_t clockid) struct futex_waitv { __u64 val; __u64 uaddr; __u32 flags; __u32 __reserved; };h]hfutex_waitv(struct futex_waitv *waiters, unsigned int nr_futexes, unsigned int flags, struct timespec *timeout, clockid_t clockid) struct futex_waitv { __u64 val; __u64 uaddr; __u32 flags; __u32 __reserved; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjhhubh)}(hX用户空间设置一个struct futex_waitv数组(最多128项),设置 ``uaddr`` 为等待的 地址, ``val`` 为期望值, ``flags`` 为指定的类型(如private)和futex的大小。 ``__reserved`` 需要置为0,但是它可用作未来扩展。指向数组第一个元素的指针作为 ``waiters`` 传递。如果 ``waiters`` 或任何的 ``uaddr`` 地址无效,将返回 ``-EFAULT`` 。h](hL用户空间设置一个struct futex_waitv数组(最多128项),设置 }(hjhhhNhNubj)}(h ``uaddr``h]huaddr}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 为等待的 地址, }(hjhhhNhNubj)}(h``val``h]hval}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 为期望值, }(hjhhhNhNubj)}(h ``flags``h]hflags}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh8 为指定的类型(如private)和futex的大小。 }(hjhhhNhNubj)}(h``__reserved``h]h __reserved}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh] 需要置为0,但是它可用作未来扩展。指向数组第一个元素的指针作为 }(hjhhhNhNubj)}(h ``waiters``h]hwaiters}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 传递。如果 }(hjhhhNhNubj)}(h ``waiters``h]hwaiters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 或任何的 }(hjhhhNhNubj)}(h ``uaddr``h]huaddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 地址无效,将返回 }(hjhhhNhNubj)}(h ``-EFAULT``h]h-EFAULT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK(hjhhubh)}(h如果用户空间拥有32位的指针,那么需要做显式转换来保证高位清零。 ``uintptr_t`` 设计 得很精巧,在32/64位的指针上都正常工作。h](h]如果用户空间拥有32位的指针,那么需要做显式转换来保证高位清零。 }(hjhhhNhNubj)}(h ``uintptr_t``h]h uintptr_t}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh@ 设计 得很精巧,在32/64位的指针上都正常工作。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK-hjhhubh)}(hn``nr_futexes`` 指定了数组的大小。不在[1,128]区间内的值会使系统调用返回 ``-EINVAL`` 。h](j)}(h``nr_futexes``h]h nr_futexes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhQ 指定了数组的大小。不在[1,128]区间内的值会使系统调用返回 }(hjhhhNhNubj)}(h ``-EINVAL``h]h-EINVAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK0hjhhubh)}(hH系统调用的 ``flags`` 参数需要置0,但可用作未来扩展。h](h系统调用的 }(hj hhhNhNubj)}(h ``flags``h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh/ 参数需要置0,但可用作未来扩展。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK2hjhhubh)}(hX 对于每个 ``waiters`` 数组中的项,在 ``uaddr`` 的当前值会和 ``val`` 比较。如果 不一致,系统调用会撤销截至目前完成的所有工作,并返回 ``-EAGAIN`` 。如果所有测试 和验证都通过,系统调用会等待直到以下情况之一发生:h](h 对于每个 }(hj*hhhNhNubj)}(h ``waiters``h]hwaiters}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh 数组中的项,在 }(hj*hhhNhNubj)}(h ``uaddr``h]huaddr}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh 的当前值会和 }(hj*hhhNhNubj)}(h``val``h]hval}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubh` 比较。如果 不一致,系统调用会撤销截至目前完成的所有工作,并返回 }(hj*hhhNhNubj)}(h ``-EAGAIN``h]h-EAGAIN}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubhb 。如果所有测试 和验证都通过,系统调用会等待直到以下情况之一发生:}(hj*hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK4hjhhubh bullet_list)}(hhh](h list_item)}(h1指定的timeout超时,返回 ``-ETIMEOUT`` 。h]h)}(hjh](h 指定的timeout超时,返回 }(hjhhhNhNubj)}(h ``-ETIMEOUT``h]h -ETIMEOUT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK8hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hH一个信号被传递给睡眠中的任务,返回 ``-ERESTARTSYS`` 。h]h)}(hjh](h4一个信号被传递给睡眠中的任务,返回 }(hjhhhNhNubj)}(h``-ERESTARTSYS``h]h -ERESTARTSYS}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK9hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hM某个列表中的futex被唤醒,返回那个被唤醒的futex的索引。 h]h)}(hL某个列表中的futex被唤醒,返回那个被唤醒的futex的索引。h]hL某个列表中的futex被唤醒,返回那个被唤醒的futex的索引。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]bullet-uh1jhhhK8hjhhubh)}(hr关于如何使用接口的例子可以在 ``tools/testing/selftests/futex/functional/futex_waitv.c`` 中找到。h](h+关于如何使用接口的例子可以在 }(hjhhhNhNubj)}(h:``tools/testing/selftests/futex/functional/futex_waitv.c``h]h6tools/testing/selftests/futex/functional/futex_waitv.c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 中找到。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK