# Russian translation of manpages # This file is distributed under the same license as the manpages-l10n package. # Copyright © of this file: # Azamat Hackimov , 2017. # Dmitry Bolkhovskikh , 2017. # Yuri Kozlov , 2011-2019. # Иван Павлов , 2017. msgid "" msgstr "" "Project-Id-Version: manpages-l10n\n" "POT-Creation-Date: 2024-06-01 05:51+0200\n" "PO-Revision-Date: 2019-09-27 19:31+0300\n" "Last-Translator: Yuri Kozlov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" "%100>=11 && n%100<=14)? 2 : 3);\n" "X-Generator: Lokalize 2.0\n" #. type: TH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "futex" msgstr "futex" #. type: TH #: archlinux debian-unstable opensuse-tumbleweed #, no-wrap msgid "2024-05-02" msgstr "2 мая 2024 г." #. type: TH #: archlinux debian-unstable #, fuzzy, no-wrap #| msgid "Linux man-pages 6.7" msgid "Linux man-pages 6.8" msgstr "Linux man-pages 6.7" #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "NAME" msgstr "ИМЯ" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "futex - fast user-space locking" msgstr "futex - быстрая блокировка в пользовательском пространстве" #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "LIBRARY" msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "Standard C library (I, I<-lc>)" msgstr "" #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "SYNOPSIS" msgstr "СИНТАКСИС" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "" "B<#include Elinux/futex.hE> /* Definition of B constants */\n" "B<#include Esys/syscall.hE> /* Definition of B constants */\n" "B<#include Eunistd.hE>\n" msgstr "" "B<#include Elinux/futex.hE> /* определения констант B */\n" "B<#include Esys/syscall.hE> /* определения констант B */\n" "B<#include Eunistd.hE>\n" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy, no-wrap #| msgid "" #| "BIB<, int >IB<, int >IB<,>\n" #| "B< const struct timespec *>IB<,>I< > /* or: BIB< */>\n" #| "B< int *>IB<, int >IB<);>\n" msgid "" "BIB<, int >IB<, uint32_t >IB<,>\n" "B< const struct timespec *>IB<,>I< > /* or: BIB< */>\n" "B< uint32_t *>IB<, uint32_t >IB<);>\n" msgstr "" "BIB<, int >IB<, int >IB<,>\n" "B< const struct timespec *>IB<,>I< > /* or: BIB< */>\n" "B< int *>IB<, int >IB<);>\n" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy #| msgid "" #| "Glibc does not provide a wrapper for this system call; call it using " #| "B(2)." msgid "" "I: glibc provides no wrapper for B(), necessitating the use of " "B(2)." msgstr "" "В glibc нет обёртки для данного системного вызова; запускайте его с помощью " "B(2)." #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "DESCRIPTION" msgstr "ОПИСАНИЕ" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The B() system call provides a method for waiting until a certain " "condition becomes true. It is typically used as a blocking construct in the " "context of shared-memory synchronization. When using futexes, the majority " "of the synchronization operations are performed in user space. A user-space " "program employs the B() system call only when it is likely that the " "program has to block for a longer time until the condition becomes true. " "Other B() operations can be used to wake any processes or threads " "waiting for a particular condition." msgstr "" "Системный вызов B() предоставляет программам метод для ожидания пока " "определённое условие не станет истинным. Обычно, этот системный вызов " "используется блокирующая конструкция в контексте синхронизации общей памяти. " "При использовании фьютексов основные операции синхронизации выполняются в " "пространстве пользователя. Программы пользовательского пространства " "выполняются системный вызов B() только когда нужно, чтобы программа " "вошла в режим ожидания на долгий срок, пока условие не станет истинным. " "Также B() можно использовать для пробуждения процессов или нитей, " "ожидающих определённого условия." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy #| msgid "" #| "A futex is a 32-bit value\\(emreferred to below as a I" #| "\\(emwhose address is supplied to the B() system call. (Futexes " #| "are 32 bits in size on all platforms, including 64-bit systems.) All " #| "futex operations are governed by this value. In order to share a futex " #| "between processes, the futex is placed in a region of shared memory, " #| "created using (for example) B(2) or B(2). (Thus, the " #| "futex word may have different virtual addresses in different processes, " #| "but these addresses all refer to the same location in physical memory.) " #| "In a multithreaded program, it is sufficient to place the futex word in a " #| "global variable shared by all threads." msgid "" "A futex is a 32-bit value\\[em]referred to below as a I" "\\[em]whose address is supplied to the B() system call. (Futexes " "are 32 bits in size on all platforms, including 64-bit systems.) All futex " "operations are governed by this value. In order to share a futex between " "processes, the futex is placed in a region of shared memory, created using " "(for example) B(2) or B(2). (Thus, the futex word may have " "different virtual addresses in different processes, but these addresses all " "refer to the same location in physical memory.) In a multithreaded program, " "it is sufficient to place the futex word in a global variable shared by all " "threads." msgstr "" "Фьютекс это 32-битное значение — называемое далее I<словом фьютекса> — чей " "адрес передаётся в системный вызов B() (фьютексы имеют размер в 32 " "бита на всех платформах, включая 64-битные системы). Все операции с " "фьютексами выполняются с этим значением. Чтобы сделать фьюетекс общим между " "процессами, фьютекс помещается в область общем памяти, создаваемой с помощью " "(например) B(2) или B(2) (то есть слово фьютекса может иметь " "различающиеся виртуальные адреса в разных процессах, но эти адреса всё равно " "указывают на одну область в физической памяти). В многонитевых программах " "достаточно поместить слово фьютекса в глобальную переменную, доступную из " "всех нитей." #. Notes from Darren Hart (Dec 2015): #. Totally ordered with respect futex operations refers to semantics #. of the ACQUIRE/RELEASE operations and how they impact ordering of #. memory reads and writes. The kernel futex operations are protected #. by spinlocks, which ensure that all operations are serialized #. with respect to one another. #. This is a lot to attempt to define in this document. Perhaps a #. reference to linux/Documentation/memory-barriers.txt as a footnote #. would be sufficient? Or perhaps for this manual, "serialized" would #. be sufficient, with a footnote regarding "totally ordered" and a #. pointer to the memory-barrier documentation? #. FIXME(Torvald Riegel): #. Eventually we want to have some text in NOTES to satisfy #. the reference in the following sentence #. See NOTES for a detailed specification of #. the synchronization semantics. #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "When executing a futex operation that requests to block a thread, the kernel " "will block only if the futex word has the value that the calling thread " "supplied (as one of the arguments of the B() call) as the expected " "value of the futex word. The loading of the futex word's value, the " "comparison of that value with the expected value, and the actual blocking " "will happen atomically and will be totally ordered with respect to " "concurrent operations performed by other threads on the same futex word. " "Thus, the futex word is used to connect the synchronization in user space " "with the implementation of blocking by the kernel. Analogously to an atomic " "compare-and-exchange operation that potentially changes shared memory, " "blocking via a futex is an atomic compare-and-block operation." msgstr "" "Когда выполняется операция с фьютексом, запрашивается блокировка нити, " "которую выполняет ядро только, если слово фьютекса имеет значение, которое " "передаёт вызывающая нить (в одном из аргументов вызова B()) равное " "ожидаемому значению слова фьютекса. Загрузка значения слова фьютекса, " "сравнение этого значения с ожидаемым и реальная блокировка выполняется " "автоматически и будет полностью упорядочена в соответствии с одновременными " "операциями, выполняемыми другими нитями на тем же словом фьютекса. Таким " "образом, слово фьютекса используется для обеспечения синхронизации в " "пользовательском пространстве реализованной через блокировку ядром. По " "аналогии с атомарной операцией сравнения-и-обмена, которая, потенциально, " "изменяет общую память, блокировка через фьютекс является атомарной операцией " "сравнения-и-блокировки." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "One use of futexes is for implementing locks. The state of the lock (i.e., " "acquired or not acquired) can be represented as an atomically accessed flag " "in shared memory. In the uncontended case, a thread can access or modify " "the lock state with atomic instructions, for example atomically changing it " "from not acquired to acquired using an atomic compare-and-exchange " "instruction. (Such instructions are performed entirely in user mode, and " "the kernel maintains no information about the lock state.) On the other " "hand, a thread may be unable to acquire a lock because it is already " "acquired by another thread. It then may pass the lock's flag as a futex " "word and the value representing the acquired state as the expected value to " "a B() wait operation. This B() operation will block if and " "only if the lock is still acquired (i.e., the value in the futex word still " "matches the \"acquired state\"). When releasing the lock, a thread has to " "first reset the lock state to not acquired and then execute a futex " "operation that wakes threads blocked on the lock flag used as a futex word " "(this can be further optimized to avoid unnecessary wake-ups). See " "B(7) for more detail on how to use futexes." msgstr "" "Одним из применений фьютексов является реализация блокировок. Состояние " "блокировки (т. е., получена или не получена) может быть представлено в виде " "атомарно доступного флага в общей памяти. При отсутствии конкурентов, нить " "может получить доступ или изменить состояние блокировки атомарными " "инструкциями, например атомарно изменяя её значение с не полученной на " "полученную с помощью атомарной инструкции сравнения-и-обмена (эти инструкции " "целиком выполняются в пользовательском режим, и ядро с состоянием блокировки " "ничего не делает). С другой стороны, нить может не получить блокировку, так " "как она уже получена другой нитью. После этого она может передать флаг " "блокировки в виде слова фьютекса, значением которого будет ожидаемое " "значение состояния получения в операции ожидания B(). Операция " "B() блокируется, только когда блокировка всё ещё имеется (т. е., " "значение слова фьютекса совпадает с «состояния получения»). При освобождении " "блокировки нить сначала сбрасывает состояние блокировки в не полученное, а " "затем вызывает операцию фьютекса, которая пробуждает нить, заблокированную " "флагом блокировки, используя его как слово фьютекса (в дальнейшем это может " "быть оптимизировано для устранения ненужных пробуждений). О том, как " "использовать фьютексы, смотрите B(7)." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Besides the basic wait and wake-up futex functionality, there are further " "futex operations aimed at supporting more complex use cases." msgstr "" "Кроме основных операций ожидания и пробуждения у фьютексов есть и другие " "операции, для более сложных случаев применения." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Note that no explicit initialization or destruction is necessary to use " "futexes; the kernel maintains a futex (i.e., the kernel-internal " "implementation artifact) only while operations such as B, " "described below, are being performed on a particular futex word." msgstr "" "Заметим, что для использования фьютексов не требуется явных действий по " "инициализации и удалению; ядро поддерживает фьютексы (т. е., внутренняя " "часть реализации ядра) только в операции B, описанной далее, " "обрабатывая определённое слово фьютекса." #. type: SS #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "Arguments" msgstr "Аргументы" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The I argument points to the futex word. On all platforms, futexes " "are four-byte integers that must be aligned on a four-byte boundary. The " "operation to perform on the futex is specified in the I argument; " "I is a value whose meaning and purpose depends on I." msgstr "" "В аргументе I указывает слово фьютекса. На всех платформах фьютексы " "это целые числа размером в четыре байта, которые должны быть выровнены по " "четырёх байтовой границе. Операция, выполняемая с фьютексом, задаётся в " "аргументе I; какое значение будет задаваться в I, зависит от " "I." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The remaining arguments (I, I, and I) are required " "only for certain of the futex operations described below. Where one of " "these arguments is not required, it is ignored." msgstr "" "Остальные аргументы (I, I и I) требуются только для " "определённых операций с фьютексами и описаны далее. Там, где эти аргументы " "не нужны, они игнорируются." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "For several blocking operations, the I argument is a pointer to a " "I structure that specifies a timeout for the operation. However, " "notwithstanding the prototype shown above, for some operations, the least " "significant four bytes of this argument are instead used as an integer whose " "meaning is determined by the operation. For these operations, the kernel " "casts the I value first to I, then to I, " "and in the remainder of this page, this argument is referred to as I " "when interpreted in this fashion." msgstr "" "Для некоторых операций блокировки аргументом I является указатель " "на структуру I, в которой задаётся время ожидания операции. " "Однако, несмотря на прототип, показанный выше, для некоторых операций " "используются только младшие четыре байта этого аргумента вместо целого " "числа, назначение которого определяется операцией. Для этих операций ядро " "преобразует значение I сначала к I, затем к " "I. Отсюда и до конца страницы этот аргумент будет называться " "I, когда он интерпретируется в такой манере." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Where it is required, the I argument is a pointer to a second futex " "word that is employed by the operation." msgstr "" "Там, где требуется, аргумент I представляет собой указатель на " "второе слово фьютекса, которое используется операцией." #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The interpretation of the final integer argument, I, depends on the " "operation." msgstr "" "Интерпретация последнего целочисленного аргумента, I, зависит от " "операции." #. type: SS #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "Futex operations" msgstr "Операции с фьютексами" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The I argument consists of two parts: a command that specifies the " "operation to be performed, bitwise ORed with zero or more options that " "modify the behaviour of the operation. The options that may be included in " "I are as follows:" msgstr "" "Аргумент I состоит из двух частей: команды, задающей выполняемую " "операцию, и объединённые биты нуля или более параметров, которые изменяют " "поведение операции. Параметры, которые можно включать в I:" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 2.6.22)" msgstr "B (начиная с Linux 2.6.22)" #. commit 34f01cc1f512fa783302982776895c73714ebbc2 #. I.e., It allows the kernel choose the fast path for validating #. the user-space address and avoids expensive VMA lookups, #. taking reference counts on file backing store, and so on. #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This option bit can be employed with all futex operations. It tells the " "kernel that the futex is process-private and not shared with another process " "(i.e., it is being used for synchronization only between threads of the same " "process). This allows the kernel to make some additional performance " "optimizations." msgstr "" "Этот параметр может быть использован для всех операций с фьютексами. Он " "указывает ядру, что фьютекс доступен только для одного процесса и недоступен " "другим процессам (т. е., используется для синхронизации только между нитями " "одного процесса). Это позволяет ядру выполнять некоторые дополнительные " "оптимизации для производительности." #. except the obsolete FUTEX_FD, for which the "private" flag was #. meaningless #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "As a convenience, Ilinux/futex.hE> defines a set of constants with " "the suffix B<_PRIVATE> that are equivalents of all of the operations listed " "below, but with the B ORed into the constant value. " "Thus, there are B, B, and so on." msgstr "" "Для удобства, в Ilinux/futex.hE> определён набор констант с " "суффиксом B<_PRIVATE>, которые эквивалентны всем операциям, перечисленным " "ниже, но с добавленным константным значением флага B. То " "есть, существуют B, B и т. д." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 2.6.28)" msgstr "B (начиная с Linux 2.6.28)" #. commit 1acdac104668a0834cfa267de9946fac7764d486 #. commit 337f13046ff03717a9e99675284a817527440a49 #. commit bf22a6976897977b0a3f1aeba6823c959fc4fdae #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy #| msgid "" #| "This option bit can be employed only with the B, " #| "B, and (since Linux 4.5) B operations." msgid "" "This option bit can be employed only with the B, " "B, (since Linux 4.5) B, and (since Linux " "5.14) B operations." msgstr "" "Этот бит параметра может применяться только с операциями " "B, B и B (начиная с " "Linux 4.5)." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "If this option is set, the kernel measures the I against the " "B clock." msgstr "" "Если он указан, то ядро измеряет I по часам B." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "If this option is not set, the kernel measures the I against the " "B clock." msgstr "" "Если он не указан, то ядро измеряет I по часам B." #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "The operation specified in I is one of the following:" msgstr "Операцией в I может быть одно из:" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 2.6.0)" msgstr "B (начиная с Linux 2.6.0)" #. Strictly speaking, since some time in Linux 2.5.x #. FIXME: Torvald, I think we may need to add some explanation of #. "totally ordered" here. #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This operation tests that the value at the futex word pointed to by the " "address I still contains the expected value I, and if so, then " "sleeps waiting for a B operation on the futex word. The load of " "the value of the futex word is an atomic memory access (i.e., using atomic " "machine instructions of the respective architecture). This load, the " "comparison with the expected value, and starting to sleep are performed " "atomically and totally ordered with respect to other futex operations on the " "same futex word. If the thread starts to sleep, it is considered a waiter " "on this futex word. If the futex value does not match I, then the call " "fails immediately with the error B." msgstr "" "Эта операция проверяет, что значение слова фьютекса, на которое указывает " "адрес I по прежнему содержит ожидаемое значение I и если это " "так, то засыпает, ожидая операции B для этого слова фьютекса. " "Загрузка значения слова фьютекса является атомарным доступом к памяти (т. " "е., используются атомарные машинные инструкции соответствующей архитектуры). " "Эта загрузка, сравнение с ожидаемым значением и запуск сна выполняются " "атомарно и целиком упорядочены относительно других фьютекс-операций с этим " "словом фьютекса. Если нить начала засыпать, то считается что она — ожидающий " "этого слова фьютекса. Если значение фьютекса не совпадает с I, то вызов " "немедленно завершается с ошибкой B." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The purpose of the comparison with the expected value is to prevent lost " "wake-ups. If another thread changed the value of the futex word after the " "calling thread decided to block based on the prior value, and if the other " "thread executed a B operation (or similar wake-up) after the " "value change and before this B operation, then the calling " "thread will observe the value change and will not start to sleep." msgstr "" "Целью сравнения с ожидаемым значением является предотвращение потери " "пробуждения. Если другая нить изменит значение слова фьютекса после того, " "как вызывающая нить решила заблокироваться из-за предыдущего значения и если " "другая нить выполнила операцию B (или подобное пробуждение) " "после изменения значения и до этой операции B, то вызывающая " "нить увидит эту смену значения и не станет впадать в сон." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "If the I is not NULL, the structure it points to specifies a " "timeout for the wait. (This interval will be rounded up to the system clock " "granularity, and is guaranteed not to expire early.) The timeout is by " "default measured according to the B clock, but, since Linux " "4.5, the B clock can be selected by specifying " "B in I. If I is NULL, the call " "blocks indefinitely." msgstr "" "Если значение I не равно NULL, то структура, на которую он " "указывает, определяет время ожидания (этот интервал будет округлён до " "точности системных часов, и гарантируется, что он не наступит раньше " "положенного). По умолчанию время ожидания измеряется по часам " "B, но начиная с Linux 4.5 можно выбрать часы " "B, указав B в I. Если " "I равно NULL, то вызов блокируется бессрочно." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "I: for B, I is interpreted as a I " "value. This differs from other futex operations, where I is " "interpreted as an absolute value. To obtain the equivalent of B " "with an absolute timeout, employ B with I specified " "as B." msgstr "" "I<Замечание>: при B значение I интерпретируется как " "I<относительное>. В этом отличие от других операций над фьютексами, в " "которых I интерпретируется как абсолютное значение. Чтобы получить " "эквивалент B с абсолютным временем ожидания укажите " "B в I вместе с B." #. FIXME . (Torvald) I think we should remove this. Or maybe adapt to a #. different example. #. For #. .BR futex (7), #. this call is executed if decrementing the count gave a negative value #. (indicating contention), #. and will sleep until another process or thread releases #. the futex and executes the #. .B FUTEX_WAKE #. operation. #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "The arguments I and I are ignored." msgstr "Аргументы I и I игнорируются." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 2.6.0)" msgstr "B (начиная с Linux 2.6.0)" #. Strictly speaking, since Linux 2.5.x #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This operation wakes at most I of the waiters that are waiting (e.g., " "inside B) on the futex word at the address I. Most " "commonly, I is specified as either 1 (wake up a single waiter) or " "B (wake up all waiters). No guarantee is provided about which " "waiters are awoken (e.g., a waiter with a higher scheduling priority is not " "guaranteed to be awoken in preference to a waiter with a lower priority)." msgstr "" "Эта операция пробуждает не больше I процессов, ожидающих (например, " "внутри B) слово фьютекса по адресу I. Чаще всего, I " "присваивают или 1 (пробудить одного ожидающего), или B (пробудить " "всех ожидающих). Не гарантируется, что разбудят каких-то определённых " "ожидающих (например, что ожидающий с большим приоритетом планировщика будет " "разбужен раньше ожидающего, имеющего меньший приоритет)." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "The arguments I, I, and I are ignored." msgstr "Аргументы I, I и I игнорируются." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (from Linux 2.6.0 up to and including Linux 2.6.25)" msgstr "B (начиная с Linux 2.6.0 и по Linux 2.6.25 включительно)" #. Strictly speaking, from Linux 2.5.x to Linux 2.6.25 #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This operation creates a file descriptor that is associated with the futex " "at I. The caller must close the returned file descriptor after use. " "When another process or thread performs a B on the futex word, " "the file descriptor indicates as being readable with B(2), B(2) и B(7)." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The file descriptor can be used to obtain asynchronous notifications: if " "I is nonzero, then, when another process or thread executes a " "B, the caller will receive the signal number that was passed in " "I." msgstr "" "Файловый дескриптор можно использовать для получения асинхронных " "уведомлений: если I не равно нулю, то когда другой процесс или нить " "выполняют B, то вызывающий примет сигнал с номером, который был " "указан в I." #. commit 82af7aca56c67061420d618cc5a30f0fd4106b80 #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Because it was inherently racy, B has been removed from Linux " "2.6.26 onward." msgstr "" "Так как по своей природе операция B приводит к состязательности, " "она была удалена из Linux, начиная с версии 2.6.26." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 2.6.0)" msgstr "B (начиная с Linux 2.6.0)" #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This operation performs the same task as B (see below), " "except that no check is made using the value in I. (The argument " "I is ignored.)" msgstr "" "Эта операция выполняет ту же задачу, что и B (смотрите " "далее), за исключением того, что она не проверяет используемое значение в " "I (аргумент I игнорируется)." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 2.6.7)" msgstr "B (начиная с Linux 2.6.7)" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This operation first checks whether the location I still contains the " "value I. If not, the operation fails with the error B. " "Otherwise, the operation wakes up a maximum of I waiters that are " "waiting on the futex at I. If there are more than I waiters, " "then the remaining waiters are removed from the wait queue of the source " "futex at I and added to the wait queue of the target futex at " "I. The I argument specifies an upper limit on the number of " "waiters that are requeued to the futex at I." msgstr "" "Сначала эта операция проверяет, что по адресу I по прежнему " "содержится значение I. Если нет, то операция завершается с ошибкой " "B. В противном случае, операция пробуждает не более I " "ожидающих, которые ждут фьютекс по адресу I. Если существует более " "I ожидающих, то оставшиеся ожидающие удаляются из очереди ожидания " "фьютекса-источника по адресу I и добавляются в очередь ожидания " "фьютекса-назначения по адресу I. В аргументе I задаётся " "верхний предел количества ожидающих, которые перемещаются в очередь фьютекса " "по адресу I." #. FIXME(Torvald) Is the following correct? Or is just the decision #. which threads to wake or requeue part of the atomic operation? #. Notes from a f2f conversation with Thomas Gleixner (Aug 2015): ### #. The operation is serialized with respect to operations on both #. source and target futex. No other waiter can enqueue itself #. for waiting and no other waiter can dequeue itself because of #. a timeout or signal. #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The load from I is an atomic memory access (i.e., using atomic " "machine instructions of the respective architecture). This load, the " "comparison with I, and the requeueing of any waiters are performed " "atomically and totally ordered with respect to other operations on the same " "futex word." msgstr "" "Загрузка из I является атомарным доступом к памяти (т. е., " "используются атомарные машинные инструкции соответствующей архитектуры). Эта " "загрузка, сравнение с I и перестановка в очередь ожидающих выполняются " "атомарно и целиком упорядочены относительно других фьютекс-операций с этим " "словом фьютекса." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Typical values to specify for I are 0 or 1. (Specifying B is " "not useful, because it would make the B operation " "equivalent to B.) The limit value specified via I is " "typically either 1 or B. (Specifying the argument as 0 is not " "useful, because it would make the B operation equivalent " "to B.)" msgstr "" "Типичными значениями I являются 0 или 1 (указание B " "бесполезно, так как это сделало бы операцию B " "эквивалентной B). Значение ограничения, указанное в I, " "обычно, или 1 или B (указание 0 бесполезно, так как это сделало бы " "операцию B эквивалентной B)." #. But, as Rich Felker points out, there remain valid use cases for #. FUTEX_REQUEUE, for example, when the calling thread is requeuing #. the target(s) to a lock that the calling thread owns #. From: Rich Felker #. Date: Wed, 29 Oct 2014 22:43:17 -0400 #. To: Darren Hart #. CC: libc-alpha@sourceware.org, ... #. Subject: Re: Add futex wrapper to glibc? #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The B operation was added as a replacement for the " "earlier B. The difference is that the check of the value at " "I can be used to ensure that requeueing happens only under certain " "conditions, which allows race conditions to be avoided in certain use cases." msgstr "" "Операция B была добавлена в качестве замены имевшейся " "B. Различие в том, что проверку значения по адресу I " "можно использовать для гарантии того, что перестановка в очередь произойдёт " "только при определённых условиях, что в определённых случаях позволит " "избежать состязательности." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Both B and B can be used to avoid " "\"thundering herd\" wake-ups that could occur when using B in " "cases where all of the waiters that are woken need to acquire another " "futex. Consider the following scenario, where multiple waiter threads are " "waiting on B, a wait queue implemented using a futex:" msgstr "" "И B и B можно использовать для недопущения " "«нашествия орды» из пробудившихся, которое может произойти при использовании " "B в случаях, когда всем разбуженным ожидающим требуется " "заблокировать другой фьютекс. Рассмотрим следующий сценарий, где несколько " "ожидающих нитей ждут B, очередь ожидания реализована с помощью фьютекса:" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "" "lock(A)\n" "while (!check_value(V)) {\n" " unlock(A);\n" " block_on(B);\n" " lock(A);\n" "};\n" "unlock(A);\n" msgstr "" "lock(A)\n" "while (!check_value(V)) {\n" " unlock(A);\n" " block_on(B);\n" " lock(A);\n" "};\n" "unlock(A);\n" #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "If a waker thread used B, then all waiters waiting on B would be " "woken up, and they would all try to acquire lock A. However, waking all of " "the threads in this manner would be pointless because all except one of the " "threads would immediately block on lock A again. By contrast, a requeue " "operation wakes just one waiter and moves the other waiters to lock A, and " "when the woken waiter unlocks A then the next waiter can proceed." msgstr "" "Если пробуждающая нить использует B, то все ожидающие,ждущие B, " "проснулись бы, и попытались получить блокировку A. Однако пробуждение всех " "нитей таким образом было бы нецелесообразно, так как все кроме одной нити " "снова немедленно бы заблокировались в ожидании A. В отличие от этого, " "операция перестановки в очередь разбудит только одного ожидающего и " "переместит остальных ожидающих в ожидание блокировки A, и когда разбуженный " "ожидающий разблокирует A, то следующий ожидающий сможет продолжить работу." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 2.6.14)" msgstr "B (начиная с Linux 2.6.14)" #. commit 4732efbeb997189d9f9b04708dc26bf8613ed721 #. Author: Jakub Jelinek #. Date: Tue Sep 6 15:16:25 2005 -0700 #. FIXME. (Torvald) The glibc condvar implementation is currently being #. revised (e.g., to not use an internal lock anymore). #. It is probably more future-proof to remove this paragraph. #. [Torvald, do you have an update here?] #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This operation was added to support some user-space use cases where more " "than one futex must be handled at the same time. The most notable example " "is the implementation of B(3), which requires " "operations on two futexes, the one used to implement the mutex and the one " "used in the implementation of the wait queue associated with the condition " "variable. B allows such cases to be implemented without " "leading to high rates of contention and context switching." msgstr "" "Эта операция была добавлена для работы в некоторых случаях из " "пользовательского пространства, в которых нужно одновременно учитывать " "несколько фьютексов. Самый известный пример — реализация " "B(3), которая требует операций для работы с двумя " "фьютексами: один для реализации мьютекса, а другой для реализации очереди " "ожидания, связанной с переменной условия. Операция B " "позволяет это реализовать без увеличения состязательности и контекстного " "переключения." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The B operation is equivalent to executing the following code " "atomically and totally ordered with respect to other futex operations on any " "of the two supplied futex words:" msgstr "" "Операция B эквивалентна выполнению следующего кода, при чём, " "атомарно и полностью упорядочено в соответствии с другими фьютекс-" "операциями, выполняемыми над двумя указанными словами фьютекса:" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "" "uint32_t oldval = *(uint32_t *) uaddr2;\n" "*(uint32_t *) uaddr2 = oldval I I;\n" "futex(uaddr, FUTEX_WAKE, val, 0, 0, 0);\n" "if (oldval I I)\n" " futex(uaddr2, FUTEX_WAKE, val2, 0, 0, 0);\n" msgstr "" "uint32_t oldval = *(uint32_t *) uaddr2;\n" "*(uint32_t *) uaddr2 = oldval I I;\n" "futex(uaddr, FUTEX_WAKE, val, 0, 0, 0);\n" "if (oldval I I)\n" " futex(uaddr2, FUTEX_WAKE, val2, 0, 0, 0);\n" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "In other words, B does the following:" msgstr "Иначе говоря, B делает следующее:" #. type: IP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "\\[bu]" msgstr "\\[bu]" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "saves the original value of the futex word at I and performs an " "operation to modify the value of the futex at I; this is an atomic " "read-modify-write memory access (i.e., using atomic machine instructions of " "the respective architecture)" msgstr "" "сохраняет первоначальное значение слова фьютекса по адресу I и " "выполняет операцию изменения значения фьютекса по адресу I; это " "атомарная операция с памятью по чтению-изменению-записи (т. е., используются " "атомарные машинные инструкции на соответствующей архитектуре);" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "wakes up a maximum of I waiters on the futex for the futex word at " "I; and" msgstr "" "пробуждает не более I ожидающих у фьютекса слова фьютекса по адресу " "I; и" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "dependent on the results of a test of the original value of the futex word " "at I, wakes up a maximum of I waiters on the futex for the " "futex word at I." msgstr "" "в зависимости от результата проверки первоначального значения слова фьютекса " "по адресу I, пробуждает не более I ожидающих у фьютекса слова " "фьютекса по адресу I." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The operation and comparison that are to be performed are encoded in the " "bits of the argument I. Pictorially, the encoding is:" msgstr "" "Операция и сравнение, которое будет выполнено, кодируется в битах аргумента " "I. Графически, кодирование выглядит так:" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "" "+---+---+-----------+-----------+\n" "|op |cmp| oparg | cmparg |\n" "+---+---+-----------+-----------+\n" " 4 4 12 12 E== # of bits\n" msgstr "" "+---+---+-----------+-----------+\n" "|оп |сра| аргоп | аргсра |\n" "+---+---+-----------+-----------+\n" " 4 4 12 12 E== кол-во бит\n" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "Expressed in code, the encoding is:" msgstr "В виде кода это выглядит так:" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "" "#define FUTEX_OP(op, oparg, cmp, cmparg) \\e\n" " (((op & 0xf) EE 28) | \\e\n" " ((cmp & 0xf) EE 24) | \\e\n" " ((oparg & 0xfff) EE 12) | \\e\n" " (cmparg & 0xfff))\n" msgstr "" "#define FUTEX_OP(op, oparg, cmp, cmparg) \\e\n" " (((op & 0xf) EE 28) | \\e\n" " ((cmp & 0xf) EE 24) | \\e\n" " ((oparg & 0xfff) EE 12) | \\e\n" " (cmparg & 0xfff))\n" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "In the above, I and I are each one of the codes listed below. The " "I and I components are literal numeric values, except as " "noted below." msgstr "" "Указанные выше I и I могут содержат один из кодов, перечисленных " "далее. Компоненты I и I являются числовыми литералами, с " "учётом замечаний далее." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "The I component has one of the following values:" msgstr "Компонент I может иметь одно из следующих значений:" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy, no-wrap #| msgid "" #| "FUTEX_OP_SET 0 /* uaddr2 = oparg; */\n" #| "FUTEX_OP_ADD 1 /* uaddr2 += oparg; */\n" #| "FUTEX_OP_OR 2 /* uaddr2 |= oparg; */\n" #| "FUTEX_OP_ANDN 3 /* uaddr2 &= \\(tioparg; */\n" #| "FUTEX_OP_XOR 4 /* uaddr2 \\(ha= oparg; */\n" msgid "" "FUTEX_OP_SET 0 /* uaddr2 = oparg; */\n" "FUTEX_OP_ADD 1 /* uaddr2 += oparg; */\n" "FUTEX_OP_OR 2 /* uaddr2 |= oparg; */\n" "FUTEX_OP_ANDN 3 /* uaddr2 &= \\[ti]oparg; */\n" "FUTEX_OP_XOR 4 /* uaddr2 \\[ha]= oparg; */\n" msgstr "" "FUTEX_OP_SET 0 /* uaddr2 = oparg; */\n" "FUTEX_OP_ADD 1 /* uaddr2 += oparg; */\n" "FUTEX_OP_OR 2 /* uaddr2 |= oparg; */\n" "FUTEX_OP_ANDN 3 /* uaddr2 &= \\(tioparg; */\n" "FUTEX_OP_XOR 4 /* uaddr2 \\(ha= oparg; */\n" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy #| msgid "" #| "In addition, bitwise ORing the following value into I causes " #| "I<(1\\~EE\\~oparg)> to be used as the operand:" msgid "" "In addition, bitwise ORing the following value into I causes I<(1\\ " "EE\\ oparg)> to be used as the operand:" msgstr "" "Также, битовое сложение следующего значения с I приводит к использованию " "I<(1\\ EE\\~oparg)> в качестве операнда:" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "FUTEX_OP_ARG_SHIFT 8 /* Use (1 EE oparg) as operand */\n" msgstr "FUTEX_OP_ARG_SHIFT 8 /* исп. (1 EE oparg) как операнд */\n" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "The I field is one of the following:" msgstr "В поле I может быть одно из:" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "" "FUTEX_OP_CMP_EQ 0 /* if (oldval == cmparg) wake */\n" "FUTEX_OP_CMP_NE 1 /* if (oldval != cmparg) wake */\n" "FUTEX_OP_CMP_LT 2 /* if (oldval E cmparg) wake */\n" "FUTEX_OP_CMP_LE 3 /* if (oldval E= cmparg) wake */\n" "FUTEX_OP_CMP_GT 4 /* if (oldval E cmparg) wake */\n" "FUTEX_OP_CMP_GE 5 /* if (oldval E= cmparg) wake */\n" msgstr "" "FUTEX_OP_CMP_EQ 0 /* если (oldval == cmparg) — пробудить */\n" "FUTEX_OP_CMP_NE 1 /* если (oldval != cmparg) — пробудить */\n" "FUTEX_OP_CMP_LT 2 /* если (oldval E cmparg) — пробудить */\n" "FUTEX_OP_CMP_LE 3 /* если (oldval E= cmparg) — пробудить */\n" "FUTEX_OP_CMP_GT 4 /* если (oldval E cmparg) — пробудить */\n" "FUTEX_OP_CMP_GE 5 /* если (oldval E= cmparg) — пробудить */\n" #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The return value of B is the sum of the number of waiters " "woken on the futex I plus the number of waiters woken on the futex " "I." msgstr "" "Возвращаемое значение операции B — сумма количества " "разбуженных ожидающих фьютекса I и количества разбуженных ожидающих " "фьютекса I." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 2.6.25)" msgstr "B (начиная с Linux 2.6.25)" #. commit cd689985cf49f6ff5c8eddc48d98b9d581d9475d #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This operation is like B except that I is used to provide " "a 32-bit bit mask to the kernel. This bit mask, in which at least one bit " "must be set, is stored in the kernel-internal state of the waiter. See the " "description of B for further details." msgstr "" "Эта операция подобна B, за исключением того, что I " "используется для передачи 32-битной маски в ядро. Данная битовая маска, в " "которой должен быть установлен хотя бы один бит, хранится в ядре во " "внутреннем состоянии ожидающего. Подробности смотрите в описании " "B." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "If I is not NULL, the structure it points to specifies an absolute " "timeout for the wait operation. If I is NULL, the operation can " "block indefinitely." msgstr "" "Если значение I не равно NULL, то структура, на которую он " "указывает, определяет абсолютное время ожидания. Если I равно NULL, " "то операция блокируется бессрочно." #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "The I argument is ignored." msgstr "Аргумент I игнорируется." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 2.6.25)" msgstr "B (начиная с Linux 2.6.25)" #. commit cd689985cf49f6ff5c8eddc48d98b9d581d9475d #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This operation is the same as B except that the I argument " "is used to provide a 32-bit bit mask to the kernel. This bit mask, in which " "at least one bit must be set, is used to select which waiters should be " "woken up. The selection is done by a bitwise AND of the \"wake\" bit mask " "(i.e., the value in I) and the bit mask which is stored in the kernel-" "internal state of the waiter (the \"wait\" bit mask that is set using " "B). All of the waiters for which the result of the AND " "is nonzero are woken up; the remaining waiters are left sleeping." msgstr "" "Данная операция подобна B, за исключением того, что I " "используется для передачи 32-битной маски в ядро. Данная битовая маска, в " "которой должен быть установлен хотя бы один бит, используется для выбора " "ожидающих, которые должны быть разбужены. Выбор выполняется путём побитового " "И битовой маски «wake» (т. е., значения I) и битовой маски, которая " "хранится в ядре во внутреннем состоянии ожидающего (битовая маска «wait», " "устанавливающаяся с помощью B). Все ожидающие, для " "которых результат побитового И не равен нулю, пробуждаются; оставшиеся " "ожидающие продолжают спать." #. According to http://locklessinc.com/articles/futex_cheat_sheet/: #. "The original reason for the addition of these extensions #. was to improve the performance of pthread read-write locks #. in glibc. However, the pthreads library no longer uses the #. same locking algorithm, and these extensions are not used #. without the bitset parameter being all ones. #. The page goes on to note that the FUTEX_WAIT_BITSET operation #. is nevertheless used (with a bit mask of all ones) in order to #. obtain the absolute timeout functionality that is useful #. for efficiently implementing Pthreads APIs (which use absolute #. timeouts); FUTEX_WAIT provides only relative timeouts. #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The effect of B and B is to allow " "selective wake-ups among multiple waiters that are blocked on the same " "futex. However, note that, depending on the use case, employing this bit-" "mask multiplexing feature on a futex can be less efficient than simply using " "multiple futexes, because employing bit-mask multiplexing requires the " "kernel to check all waiters on a futex, including those that are not " "interested in being woken up (i.e., they do not have the relevant bit set in " "their \"wait\" bit mask)." msgstr "" "Влияние B и B позволяет выбирать " "пробуждающихся из многих ожидающих, которые заблокированы на один фьютекс. " "Однако заметим, что в зависимости от варианта применения, использование " "данного свойства комбинирования битовой маски с фьютексом может быть менее " "эффективно, чем простое использование нескольких фьютексов, так как " "использование комбинирования битовой маски требует от ядра проверки всех " "ожидающих фьютекса, включая тех, которые и не нужно было бы будить (т. е., у " "них неподходящий набор бит в их битовой маске «wait»)." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The constant B, which corresponds to all 32 bits set " "in the bit mask, can be used as the I argument for " "B and B. Other than differences in " "the handling of the I argument, the B operation is " "equivalent to B with I specified as " "B; that is, allow a wake-up by any waker. The " "B operation is equivalent to B with I " "specified as B; that is, wake up any waiter(s)." msgstr "" "Константу B, которая соответствует всем " "установленным битам в 32-битной маске, можно использовать в аргументе " "I для B и B. Кроме различий в " "обработке аргумента I, операция B эквивалентна " "B с I, равным B, то есть " "разрешается будить любого пробуждающего. Операция B эквивалентна " "B с I, равным B, то есть " "пробуждается любой(ые) пробуждающий." #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "The I and I arguments are ignored." msgstr "Аргументы I и I игнорируются." #. type: SS #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "Priority-inheritance futexes" msgstr "Наследование приоритета из-за фьютексов" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Linux supports priority-inheritance (PI) futexes in order to handle priority-" "inversion problems that can be encountered with normal futex locks. " "Priority inversion is the problem that occurs when a high-priority task is " "blocked waiting to acquire a lock held by a low-priority task, while tasks " "at an intermediate priority continuously preempt the low-priority task from " "the CPU. Consequently, the low-priority task makes no progress toward " "releasing the lock, and the high-priority task remains blocked." msgstr "" "В Linux поддерживается наследование приоритета из-за фьютексов priority-" "inheritance (PI), так как требуется решать проблему обратного приоритета, " "которая встречается у обычных блокировок фьютексов. Проблема обратного " "приоритета возникает, когда задача с высоким приоритетом блокируется в " "ожидании получения блокировки, которую удерживает задача с низким " "приоритетом, в то время как задачи со средним приоритетом постоянно " "вытесняют задачу с низким приоритетом с ЦП. В следствии этого, выполнение " "задачи с низким приоритетом никак не продвигается к освобождению блокировки, " "и задача с высоким приоритетом остаётся заблокированной." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Priority inheritance is a mechanism for dealing with the priority-inversion " "problem. With this mechanism, when a high-priority task becomes blocked by " "a lock held by a low-priority task, the priority of the low-priority task is " "temporarily raised to that of the high-priority task, so that it is not " "preempted by any intermediate level tasks, and can thus make progress toward " "releasing the lock. To be effective, priority inheritance must be " "transitive, meaning that if a high-priority task blocks on a lock held by a " "lower-priority task that is itself blocked by a lock held by another " "intermediate-priority task (and so on, for chains of arbitrary length), then " "both of those tasks (or more generally, all of the tasks in a lock chain) " "have their priorities raised to be the same as the high-priority task." msgstr "" "Наследование приоритета — это механизм, который решает проблему обратного " "приоритета. С его помощью, когда задача с высоким приоритетом блокируется из-" "за удержания блокировки задачей с низким приоритетом, приоритет задачи с " "низким приоритетом временно повышается до приоритета, имеющегося у " "заблокированной задачи, и поэтому не происходит вытеснения задачами с " "средним приоритетом, что способствует ускорению освобождения блокировки. " "Чтобы это работало, наследование приоритета должно быть транзитивным, то " "есть если задача с высоким приоритетом заблокирована, из-за удержания " "блокировки задачей с низким приоритетом, которая сама заблокирована из-за " "удержания блокировки другой задачей со средним приоритетом (и так далее, по " "цепочке произвольной длины), то для обеих этих задач (или, шире, всех задач " "в заблокированной цепочке) повышается приоритет, который равен приоритету " "задачи с высоким приоритетом." #. Quoting Darren Hart: #. These opcodes paired with the PI futex value policy (described below) #. defines a "futex" as PI aware. These were created very specifically #. in support of PI pthread_mutexes, so it makes a lot more sense to #. talk about a PI aware pthread_mutex, than a PI aware futex, since #. there is a lot of policy and scaffolding that has to be built up #. around it to use it properly (this is what a PI pthread_mutex is). #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "From a user-space perspective, what makes a futex PI-aware is a policy " "agreement (described below) between user space and the kernel about the " "value of the futex word, coupled with the use of the PI-futex operations " "described below. (Unlike the other futex operations described above, the PI-" "futex operations are designed for the implementation of very specific IPC " "mechanisms.)" msgstr "" "Со стороны пользовательского пространства фьютекс является PI из-за " "следования соглашениям (описанных далее) между пользовательским " "пространством и ядром о значении слова фьютекса и применяемым операциям над " "PI-фьютексами, описанным далее (в отличие от других операций с фьютексами, " "описанных выше, операции с PI-фьютексами разработаны для реализации очень " "специфичных механизмов IPC)." #. mtk: The following text is drawn from the Hart/Guniguntala paper #. (listed in SEE ALSO), but I have reworded some pieces #. significantly. #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The PI-futex operations described below differ from the other futex " "operations in that they impose policy on the use of the value of the futex " "word:" msgstr "" "Операции с PI-фьютексами, описанные далее, отличаются от других операций с " "фьютексами в том, что они следуют политике использования значения слова " "фьютекса:" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "If the lock is not acquired, the futex word's value shall be 0." msgstr "" "Если блокировка не получена, то значение слова фьютекса должно быть равно 0." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "If the lock is acquired, the futex word's value shall be the thread ID (TID; " "see B(2)) of the owning thread." msgstr "" "Если блокировка получена, то значение слова фьютекса должно быть равно ID " "нити (TID; смотрите B(2)), которой оно принадлежит." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "If the lock is owned and there are threads contending for the lock, then the " "B bit shall be set in the futex word's value; in other words, " "this value is:" msgstr "" "Если блокировка получена и есть претендующие на неё нити, то в значении " "слова фьютекса должен быть установлен бит B; иначе говоря, " "это значение равно:" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "FUTEX_WAITERS | TID\n" msgstr "FUTEX_WAITERS | TID\n" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(Note that is invalid for a PI futex word to have no owner and " "B set.)" msgstr "" "(заметим, что некорректное слово PI-фьютекса не имеет владельца и " "B)" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "With this policy in place, a user-space application can acquire an " "unacquired lock or release a lock using atomic instructions executed in user " "mode (e.g., a compare-and-swap operation such as I on the x86 " "architecture). Acquiring a lock simply consists of using compare-and-swap " "to atomically set the futex word's value to the caller's TID if its previous " "value was 0. Releasing a lock requires using compare-and-swap to set the " "futex word's value to 0 if the previous value was the expected TID." msgstr "" "С этой действующей политикой приложение пространства пользователя может " "получить свободную блокировку или освободить блокировку с помощью атомарных " "инструкций, выполняемых в пользовательском режиме (например, операцией " "сравнение-и-обмен I на архитектуре x86). Получение блокировки " "состоит просто из использования сравнения-и-обмена для атомарного изменения " "значения слова фьютекса на TID вызывающего, если предыдущее значение было " "равно 0. Для освобождения блокировки требуется использовать сравнение-и-" "обмен для изменения значения слова фьютекса на 0, если предыдущее значение " "равно ожидаемому TID." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy #| msgid "" #| "If a futex is already acquired (i.e., has a nonzero value), waiters must " #| "employ the B operation to acquire the lock. If other " #| "threads are waiting for the lock, then the B bit is set in " #| "the futex value; in this case, the lock owner must employ the " #| "B operation to release the lock." msgid "" "If a futex is already acquired (i.e., has a nonzero value), waiters must " "employ the B or B operations to acquire the " "lock. If other threads are waiting for the lock, then the B " "bit is set in the futex value; in this case, the lock owner must employ the " "B operation to release the lock." msgstr "" "Если фьютекс уже получен (т. е. имеет ненулевое значение), то ожидающие " "должны применить операцию B для получения блокировки. Если " "другие нити ждут блокировку, то в значении фьютекса установлен бит " "B; в этом случае владелец блокировки должен применить " "операцию B для освобождения блокировки." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "In the cases where callers are forced into the kernel (i.e., required to " "perform a B() call), they then deal directly with a so-called RT-" "mutex, a kernel locking mechanism which implements the required priority-" "inheritance semantics. After the RT-mutex is acquired, the futex value is " "updated accordingly, before the calling thread returns to user space." msgstr "" "В случаях, когда вызывающие переходят в ядро (т. е., требуется выполнение " "вызова B()), после этого они напрямую работают с так называемым RT-" "мьютексом, механизмом блокировок ядра, которым реализована требуемая " "семантика наследования приоритета. После получения RT-мьютекса, значение " "фьютекса обновляется соответствующим образом, перед возврата вызывающей нити " "в пространство пользователя." #. tglx (July 2015): #. If there are multiple waiters on a pi futex then a wake pi operation #. will wake the first waiter and hand over the lock to this waiter. This #. includes handing over the rtmutex which represents the futex in the #. kernel. The strict requirement is that the futex owner and the rtmutex #. owner must be the same, except for the update period which is #. serialized by the futex internal locking. That means the kernel must #. update the user-space value prior to returning to user space #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "It is important to note that the kernel will update the futex word's value " "prior to returning to user space. (This prevents the possibility of the " "futex word's value ending up in an invalid state, such as having an owner " "but the value being 0, or having waiters but not having the B " "bit set.)" msgstr "" "Важно упомянуть, что ядро обновит значение слова фьютекса до возврата в " "пространство пользователя (это предотвращает возможность попадания значения " "слова фьютекса в некорректное состояние, такое, что имея владельца, значение " "равно 0, или имея ожидающих, не установлен бит B)." #. tglx (July 2015): #. The FUTEX_OWNER_DIED bit can also be set on uncontended futexes, where #. the kernel has no state associated. This happens via the robust futex #. mechanism. In that case the futex value will be set to #. FUTEX_OWNER_DIED. The robust futex mechanism is also available for non #. PI futexes. #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "If a futex has an associated RT-mutex in the kernel (i.e., there are blocked " "waiters) and the owner of the futex/RT-mutex dies unexpectedly, then the " "kernel cleans up the RT-mutex and hands it over to the next waiter. This in " "turn requires that the user-space value is updated accordingly. To indicate " "that this is required, the kernel sets the B bit in the " "futex word along with the thread ID of the new owner. User space can detect " "this situation via the presence of the B bit and is then " "responsible for cleaning up the stale state left over by the dead owner." msgstr "" "Если фьютекс связан с RT-мьютексом в ядре (т. е., есть заблокированные " "ожидающие) и владелец фьютекса/RT-мьютекса неожиданно завершился, то ядро " "очищает RT-мьютекс и передаёт его следующему ожидающему. Это, в свою " "очередь, требует, чтобы значение в пользовательском пространстве было " "изменено соответствующим образом. Для сообщения о необходимости этого ядро " "изменяет бит B в слове фьютекса вместе со сменой ID нити " "нового владельца. Пользовательское пространство может определить такую " "ситуацию по установленному биту B и затем, соответствующим " "образом, очистить устаревшее состояние, возникшее из-за закончившего работу " "владельца." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "PI futexes are operated on by specifying one of the values listed below in " "I. Note that the PI futex operations must be used as paired " "operations and are subject to some additional requirements:" msgstr "" "PI-фьютексы обрабатываются при указании в I одного из значений, " "перечисленных далее. Заметим, что операции с PI-фьютексами должны " "использовать попарно и учитывать некоторые дополнительные требования:" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "B, B, and B pair with " "B. B must be called only on a futex owned " "by the calling thread, as defined by the value policy, otherwise the error " "B results." msgstr "" "Парой к операциям B, B и B " "является B. Операция B должна применяться " "только к фьютексам, принадлежащим вызывающей нити, определённой значением " "политики, или же возникнет ошибка B." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "B pairs with B. This must be " "performed from a non-PI futex to a distinct PI futex (or the error B " "results). Additionally, I (the number of waiters to be woken) must be " "1 (or the error B results)." msgstr "" "Парой к операции B является B. " "Она должна применяться для перехода с не PI-фьютекса к PI-фьютексу (или " "возникает ошибка B). Также, I (количество разбуживаемых " "ожидающих) должно равняться 1 (или возникает ошибка B)." #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "The PI futex operations are as follows:" msgstr "Операции с PI-фьютексами:" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 2.6.18)" msgstr "B (начиная с Linux 2.6.18)" #. commit c87e2837be82df479a6bae9f155c43516d2feebc #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy #| msgid "" #| "This operation is used after an attempt to acquire the lock via an atomic " #| "user-mode instruction failed because the futex word has a nonzero value" #| "\\(emspecifically, because it contained the (PID-namespace-specific) TID " #| "of the lock owner." msgid "" "This operation is used after an attempt to acquire the lock via an atomic " "user-mode instruction failed because the futex word has a nonzero value" "\\[em]specifically, because it contained the (PID-namespace-specific) TID of " "the lock owner." msgstr "" "Данная операция используется после попытки получить блокировку через " "атомарную инструкцию в пространстве пользователя, которая завершилась с " "ошибкой из-за того, что слово фьютекса не равно нулю — содержит value" "\\(emspecifically, because it contained the TID (PID в этом пространстве " "имён) владельца блокировки." #. tglx (July 2015): #. The operation here is similar to the FUTEX_WAIT logic. When the user #. space atomic acquire does not succeed because the futex value was non #. zero, then the waiter goes into the kernel, takes the kernel internal #. lock and retries the acquisition under the lock. If the acquisition #. does not succeed either, then it sets the FUTEX_WAITERS bit, to signal #. the lock owner that it needs to go into the kernel. Here is the pseudo #. code: #. lock(kernel_lock); #. retry: #. /* #. * Owner might have unlocked in user space before we #. * were able to set the waiter bit. #. */ #. if (atomic_acquire(futex) == SUCCESS) { #. unlock(kernel_lock()); #. return 0; #. } #. /* #. * Owner might have unlocked after the above atomic_acquire() #. * attempt. #. */ #. if (atomic_set_waiters_bit(futex) != SUCCESS) #. goto retry; #. queue_waiter(); #. unlock(kernel_lock); #. block(); #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The operation checks the value of the futex word at the address I. " "If the value is 0, then the kernel tries to atomically set the futex value " "to the caller's TID. If the futex word's value is nonzero, the kernel " "atomically sets the B bit, which signals the futex owner that " "it cannot unlock the futex in user space atomically by setting the futex " "value to 0. After that, the kernel:" msgstr "" "Операция проверяет значение слова фьютекса по адресу I. Если значение " "равно 0, то ядро пытается атомарно изменить слово фьютекса на TID " "вызывающего. Если слово фьютекса не равно нулю, то ядро атомарно " "устанавливает бит B, который указывает владельцу фьютекса, " "что он не может разблокировать фьютекс в пространстве пользователя атомарным " "способом посредством установки значения фьюетекса в 0. После этого ядро:" #. type: IP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "(1)" msgstr "(1)" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "Tries to find the thread which is associated with the owner TID." msgstr "Пытается найти нить-владельца по TID." #. type: IP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "(2)" msgstr "(2)" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Creates or reuses kernel state on behalf of the owner. (If this is the " "first waiter, there is no kernel state for this futex, so kernel state is " "created by locking the RT-mutex and the futex owner is made the owner of the " "RT-mutex. If there are existing waiters, then the existing state is reused.)" msgstr "" "Создаёт или повторно использует состояние ядра от имени владельца (если это " "первый ожидающий, то для этого фьютекса не состояния ядра, поэтому состояние " "ядра создаётся блокировкой RT-мьютекса и владелец фьютекса становится " "владельцем RT-мьютекса. Если ожидающие уже есть, то используется имеющееся " "состояние)." #. type: IP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "(3)" msgstr "(3)" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Attaches the waiter to the futex (i.e., the waiter is enqueued on the RT-" "mutex waiter list)." msgstr "" "Присоединяет ожидающего к фьютексу (т. е., ожидающий ставится в очередь " "списка ожидающих на основе RT-мьютекса)." #. August 2015: #. mtk: If the realm is restricted purely to SCHED_OTHER (SCHED_NORMAL) #. processes, does the nice value come into play also? #. tglx: No. SCHED_OTHER/NORMAL tasks are handled in FIFO order #. (i.e., task 1 blocks on lock A, held by task 2, #. while task 2 blocks on lock B, held by task 3) #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "If more than one waiter exists, the enqueueing of the waiter is in " "descending priority order. (For information on priority ordering, see the " "discussion of the B, B, and B " "scheduling policies in B(7).) The owner inherits either the waiter's " "CPU bandwidth (if the waiter is scheduled under the B " "policy) or the waiter's priority (if the waiter is scheduled under the " "B or B policy). This inheritance follows the lock " "chain in the case of nested locking and performs deadlock detection." msgstr "" "Если есть более одного ожидающего, то перестановка ожидающего в очередь " "выполняется в порядке убывания приоритета (упорядочивание по приоритету " "описано в разделе об алгоритмах планирования B, " "B и B в B(7)). Владелец наследует от ожидающего " "пропускную способность ЦП (если ожидающий работает по алгоритму планирования " "B) или приоритет (если ожидающий работает по алгоритму " "планирования B или B). При обнаружении вложенности " "блокировки и клинча такое наследование распространяется по всей цепочке " "блокировки." #. 2016-07-07 response from Thomas Gleixner on LKML: #. From: Thomas Gleixner #. Date: 6 July 2016 at 20:57 #. Subject: Re: futex: Allow FUTEX_CLOCK_REALTIME with FUTEX_WAIT op #. On Thu, 23 Jun 2016, Michael Kerrisk (man-pages) wrote: #. > On 06/23/2016 08:28 PM, Darren Hart wrote: #. > > And as a follow-on, what is the reason for FUTEX_LOCK_PI only using #. > > CLOCK_REALTIME? It seems reasonable to me that a user may want to wait a #. > > specific amount of time, regardless of wall time. #. > #. > Yes, that's another weird inconsistency. #. The reason is that phtread_mutex_timedlock() uses absolute timeouts based on #. CLOCK_REALTIME. glibc folks asked to make that the default behaviour back #. then when we added LOCK_PI. #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The I argument provides a timeout for the lock attempt. If " "I is not NULL, the structure it points to specifies an absolute " "timeout, measured against the B clock. If I is " "NULL, the operation will block indefinitely." msgstr "" "В аргументе I задаётся время ожидания захвата блокировки. Если " "I равно NULL, то структура, на которую он указывает, определяет " "абсолютное время ожидания, отсчитываемое по часам B. Если " "I равно NULL, то операция может быть в блокировке неопределённо " "долго." #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "The I, I, and I arguments are ignored." msgstr "Аргументы I, I и I игнорируются." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 5.14)" msgstr "B (начиная с Linux 5.14)" # #. commit bf22a6976897977b0a3f1aeba6823c959fc4fdae #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This operation is the same as B, except that the clock " "against which I is measured is selectable. By default, the " "(absolute) timeout specified in I is measured against the " "B clock, but if the B flag is " "specified in I, then the timeout is measured against the " "B clock." msgstr "" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 2.6.18)" msgstr "B (начиная с Linux 2.6.18)" #. commit c87e2837be82df479a6bae9f155c43516d2feebc #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This operation tries to acquire the lock at I. It is invoked when a " "user-space atomic acquire did not succeed because the futex word was not 0." msgstr "" "Эта операция пытается получить блокировку по адресу I. Она " "вызывается, когда не удалось выполнить атомарное получение из " "пользовательского пространства, так как слово фьютекса не равно 0." #. Paraphrasing a f2f conversation with Thomas Gleixner about the #. above point (Aug 2015): ### #. There is a rare possibility of a race condition involving an #. uncontended futex with no owner, but with waiters. The #. kernel-user-space contract is that if a futex is nonzero, you must #. go into kernel. The futex was owned by a task, and that task dies #. but there are no waiters, so the futex value is non zero. #. Therefore, the next locker has to go into the kernel, #. so that the kernel has a chance to clean up. (CMXCH on zero #. in user space would fail, so kernel has to clean up.) #. Darren Hart (Oct 2015): #. The trylock in the kernel has more state, so it can independently #. verify the flags that user space must trust implicitly. #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Because the kernel has access to more state information than user space, " "acquisition of the lock might succeed if performed by the kernel in cases " "where the futex word (i.e., the state information accessible to use-space) " "contains stale state (B and/or B). This " "can happen when the owner of the futex died. User space cannot handle this " "condition in a race-free manner, but the kernel can fix this up and acquire " "the futex." msgstr "" "Так как ядро имеет больший доступ к информации о состоянии, чем " "пользовательское пространство, получение блокировки из ядра может " "осуществиться, в случаях когда слово фьютекса (т. е., информация о состоянии " "доступна из пользовательского пространства) устарело (B и/или " "B). Это может случиться, если владелец фьютекса неожиданно " "завершился. Пользовательское пространство не может учесть это событие не " "получив состязательности, но ядро может решить данную проблему и получить " "блокировку." #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "The I, I, I, and I arguments are ignored." msgstr "Аргументы I, I, I и I игнорируются." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 2.6.18)" msgstr "B (начиная с Linux 2.6.18)" #. commit c87e2837be82df479a6bae9f155c43516d2feebc #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy #| msgid "" #| "This operation wakes the top priority waiter that is waiting in " #| "B on the futex address provided by the I argument." msgid "" "This operation wakes the top priority waiter that is waiting in " "B or B on the futex address provided by the " "I argument." msgstr "" "Данная операция будит ожидающего с самым высоким приоритетом, который ждёт " "фьютекс по адресу из I посредством операции B." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This is called when the user-space value at I cannot be changed " "atomically from a TID (of the owner) to 0." msgstr "" "Операция вызывается, когда значение по адресу I пользовательского " "пространства невозможно изменить атомарно с TID (владельца) на 0." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 2.6.31)" msgstr "B (начиная с Linux 2.6.31)" #. commit 52400ba946759af28442dee6265c5c0180ac7122 #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "This operation is a PI-aware variant of B. It requeues " "waiters that are blocked via B on I from a non-" "PI source futex (I) to a PI target futex (I)." msgstr "" "Данная операция является PI-аналогом операции B. Она " "перестанавливает ожидающих, заблокированных с помощью " "B для I, из очереди не PI-фьютекса источника " "(I) в очередь PI-фьютекса назначения (I)." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "As with B, this operation wakes up a maximum of I " "waiters that are waiting on the futex at I. However, for " "B, I is required to be 1 (since the main point is " "to avoid a thundering herd). The remaining waiters are removed from the " "wait queue of the source futex at I and added to the wait queue of " "the target futex at I." msgstr "" "Как и B, эта операция пробуждает не более I " "ожидающих, которые ждут фьютекса по адресу I. Однако у " "B значение I должно быть равно 1 (чтобы избежать " "«нашествия орды»). Оставшиеся ожидающие удаляются из очереди ожидания " "фьютекса-источника по адресу I и добавляются в очередь ожидания " "фьютекса-назначения по адресу I." #. val2 is the cap on the number of requeued waiters. #. In the glibc pthread_cond_broadcast() implementation, this argument #. is specified as INT_MAX, and for pthread_cond_signal() it is 0. #. The page at http://locklessinc.com/articles/futex_cheat_sheet/ #. notes that "priority-inheritance Futex to priority-inheritance #. Futex requeues are currently unsupported". However, probably #. the page does not need to say nothing about this, since #. Thomas Gleixner commented (July 2015): "they never will be #. supported because they make no sense at all" #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The I and I arguments serve the same purposes as for " "B." msgstr "" "Аргументы I и I служат тем же целям, что и в " "B." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B (since Linux 2.6.31)" msgstr "B (начиная с Linux 2.6.31)" #. commit 52400ba946759af28442dee6265c5c0180ac7122 #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Wait on a non-PI futex at I and potentially be requeued (via a " "B operation in another task) onto a PI futex at " "I. The wait operation on I is the same as for B." msgstr "" "Ждать не PI-фьютекса по адресу I и, потенциально быть перемещённым в " "очередь (при операции B из другой задачи) PI-фьютекса " "по адресу I. Операция ожидания на адресе I такая же как для " "B." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The waiter can be removed from the wait on I without requeueing on " "I via a B operation in another task. In this case, the " "B operation fails with the error B." msgstr "" "Ожидающий может быть удалён из ожидающих на адресе I перемещения в " "очередь у I при операции B из другой задачи. В этом " "случае операция B завершается с ошибкой B." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "The I argument is ignored." msgstr "Аргумент I игнорируется." #. Darren Hart notes that a patch to allow glibc to fully support #. PI-aware pthreads condition variables has not yet been accepted into #. glibc. The story is complex, and can be found at #. https://sourceware.org/bugzilla/show_bug.cgi?id=11588 #. Darren notes that in the meantime, the patch is shipped with various #. PREEMPT_RT-enabled Linux systems. #. Related to the preceding, Darren proposed that somewhere, man-pages #. should document the following point: #. While the Linux kernel, since Linux 2.6.31, supports requeueing of #. priority-inheritance (PI) aware mutexes via the #. FUTEX_WAIT_REQUEUE_PI and FUTEX_CMP_REQUEUE_PI futex operations, #. the glibc implementation does not yet take full advantage of this. #. Specifically, the condvar internal data lock remains a non-PI aware #. mutex, regardless of the type of the pthread_mutex associated with #. the condvar. This can lead to an unbounded priority inversion on #. the internal data lock even when associating a PI aware #. pthread_mutex with a condvar during a pthread_cond*_wait #. operation. For this reason, it is not recommended to rely on #. priority inheritance when using pthread condition variables. #. The problem is that the obvious location for this text is #. the pthread_cond*wait(3) man page. However, such a man page #. does not currently exist. #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The B and B were added to " "support a fairly specific use case: support for priority-inheritance-aware " "POSIX threads condition variables. The idea is that these operations should " "always be paired, in order to ensure that user space and the kernel remain " "in sync. Thus, in the B operation, the user-space " "application pre-specifies the target of the requeue that takes place in the " "B operation." msgstr "" "Операции B и B добавлены для " "довольно узкого варианта применения — поддержки переменных условия нитей " "POSIX с наследованием приоритета. Идея в том, что эти операции всегда должны " "использоваться попарно, для поддержания синхронизации между пользовательским " "пространством и ядром. То есть в операции B " "приложение пользовательского пространства заранее задаёт назначение для " "перемещения в очередь, которое проводится операцией B." #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "RETURN VALUE" msgstr "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy #| msgid "" #| "In the event of an error (and assuming that B() was invoked via " #| "B(2)), all operations return -1 and set I to indicate the " #| "cause of the error." msgid "" "In the event of an error (and assuming that B() was invoked via " "B(2)), all operations return -1 and set I to indicate the " "error." msgstr "" "В случае ошибки (предполагается, что B() был вызван через " "B(2)), все операции возвращают -1 и присваивают I номер " "ошибки." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The return value on success depends on the operation, as described in the " "following list:" msgstr "При успешном выполнении возвращаемое значение зависит от операции:" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Returns 0 if the caller was woken up. Note that a wake-up can also be " "caused by common futex usage patterns in unrelated code that happened to " "have previously used the futex word's memory location (e.g., typical futex-" "based implementations of Pthreads mutexes can cause this under some " "conditions). Therefore, callers should always conservatively assume that a " "return value of 0 can mean a spurious wake-up, and use the futex word's " "value (i.e., the user-space synchronization scheme) to decide whether to " "continue to block or not." msgstr "" "Значение 0 возвращается, если вызывающий был разбужен. Заметим, что " "пробуждение также может быть вызвано часто используемыми вариантами " "использования фьютексов в не связанном коде, которое случается, если память " "под слово фьютекса использовалась ранее (например, при типичной реализации " "фьютексов на основе мьютексов Pthreads это может возникать при определённых " "условиях). Поэтому вызывающий всегда должен консервативно предполагать, что " "возвращаемое значение 0 может означать побочное пробуждение (spurious wake-" "up), и учитывать значение слово фьютекса (т. е. схема с синхронизацией " "пользовательского пространства) при принятии решения нужна дальнейшее " "ожидание или нет." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "Returns the number of waiters that were woken up." msgstr "Возвращается количество разбуженных ожидающих." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "Returns the new file descriptor associated with the futex." msgstr "Возвращается новый файловый дескриптор, связанный с фьютексом." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Returns the total number of waiters that were woken up or requeued to the " "futex for the futex word at I. If this value is greater than " "I, then the difference is the number of waiters requeued to the futex " "for the futex word at I." msgstr "" "Возвращается общее количество ожидающих, которые будятся или перемещаются в " "очередь фьютекса, у которого слово фьютекса задано по адресу I. Если " "это значение больше чем I, то разница это количество ожидающих, " "перемещённых в очередь фьютекса, у которого слово фьютекса задано по адресу " "I." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Returns the total number of waiters that were woken up. This is the sum of " "the woken waiters on the two futexes for the futex words at I and " "I." msgstr "" "Возвращается общее количество разбуженных ожидающих. Это сумма разбуженных " "ожидающих у двух фьютексов для слов фьютексов по адресам I и " "I." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Returns 0 if the caller was woken up. See B for how to " "interpret this correctly in practice." msgstr "" "Возвращается 0, если вызывающий был разбужен. Смотрите в описании " "B, как это правильно учитывать на практике." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "Returns 0 if the futex was successfully locked." msgstr "Возвращается 0, если фьютекс был успешно заблокирован." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "Returns 0 if the futex was successfully unlocked." msgstr "Возвращается 0, если фьютекс был успешно разблокирован." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Returns the total number of waiters that were woken up or requeued to the " "futex for the futex word at I. If this value is greater than " "I, then difference is the number of waiters requeued to the futex for " "the futex word at I." msgstr "" "Возвращается общее количество ожидающих, которые будятся или перемещаются в " "очередь фьютекса, у которого слово фьютекса задано по адресу I. Если " "это значение больше чем I, то разница это количество ожидающих, " "перемещённых в очередь фьютекса, у которого слово фьютекса задано по адресу " "I." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Returns 0 if the caller was successfully requeued to the futex for the futex " "word at I." msgstr "" "Возвращается 0, если вызывающий был успешно перемещён в очередь фьютекса со " "словом фьютекса по адресу I." #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "ERRORS" msgstr "ОШИБКИ" #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "No read access to the memory of a futex word." msgstr "Нет доступа на чтение памяти слова фьютекса." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B, B, B) The value " "pointed to by I was not equal to the expected value I at the " "time of the call." msgstr "" "(B, B, B) Значение, на " "которое указывает I, не было равно ожидаемому значению I на " "момент вызова." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "B: on Linux, the symbolic names B and B (both of " "which appear in different parts of the kernel futex code) have the same " "value." msgstr "" "B<Замечание>: в Linux символические имена B и B (оба " "есть в разных частях кода фьютекса ядра) имеют одинаковое значение." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B, B) The value pointed to by " "I is not equal to the expected value I." msgstr "" "(B, B) Значение, на которое " "указывает I, не равно ожидаемому значению I." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B, B, B, " "B) The futex owner thread ID of I (for " "B: I) is about to exit, but has not yet " "handled the internal state cleanup. Try again." msgstr "" "(B, B, B, " "B) ID нити владельца фьютекса по адресу I (для " "B — I) вскоре закончит работу, но не выполнил " "очистку внутреннего состояния. Попробуйте ещё раз." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B, B, B, " "B) The futex word at I is already locked by " "the caller." msgstr "" "(B, B, B, " "B) Слово фьютекса по адресу I уже заблокировано " "вызывающим." #. FIXME . I see that kernel/locking/rtmutex.c uses EDEADLK in some #. places, and EDEADLOCK in others. On almost all architectures #. these constants are synonymous. Is there a reason that both #. names are used? #. tglx (July 2015): "No. We should probably fix that." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B) While requeueing a waiter to the PI futex for the " "futex word at I, the kernel detected a deadlock." msgstr "" "(B) Во время перемещения в другую очередь ожидающего " "PI-фьютекса со словом фьютекса по адресу I ядро обнаружило тупиковую " "блокировку (deadlock)." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "A required pointer argument (i.e., I, I, or I) did " "not point to a valid user-space address." msgstr "" "Требуемый аргумент указателя (т. е., I, I или I) не " "указывает на допустимый адрес пользовательского пространства." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy #| msgid "" #| "A B or B operation was interrupted by a " #| "signal (see B(7)). In kernels before Linux 2.6.22, this error " #| "could also be returned for a spurious wakeup; since Linux 2.6.22, this no " #| "longer happens." msgid "" "A B or B operation was interrupted by a " "signal (see B(7)). Before Linux 2.6.22, this error could also be " "returned for a spurious wakeup; since Linux 2.6.22, this no longer happens." msgstr "" "Операция B или B была прервана сигналом " "(смотрите B(7)). В ядрах до версии Linux 2.6.22 эта ошибка также " "возвращалась при побочном пробуждении; начиная с Linux 2.6.22 этого больше " "не происходит." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The operation in I is one of those that employs a timeout, but the " "supplied I argument was invalid (I was less than zero, or " "I was not less than 1,000,000,000)." msgstr "" "Операция в I является одной из тех, что используют ожидание " "(timeout), но значение аргумента I некорректно (I меньше " "нуля или I больше 1000000000)." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy #| msgid "" #| "The operation specified in I employs one or both of the " #| "pointers I and I, but one of these does not point to a " #| "valid object\\(emthat is, the address is not four-byte-aligned." msgid "" "The operation specified in I employs one or both of the pointers " "I and I, but one of these does not point to a valid object" "\\[em]that is, the address is not four-byte-aligned." msgstr "" "Операция, указанная в I, использует один или оба указателя " "I и I, но один из них не указывает на корректный объект, то " "есть адрес не выровнен по четырёх байтовой границе." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B, B) The bit mask supplied in " "I is zero." msgstr "" "(B, B) Битовая маска, указанная в " "I, равна нулю." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B) I equals I (i.e., an attempt was " "made to requeue to the same futex)." msgstr "" "(B) Значение I равно I (т. е., " "предпринята попытка выполнить перемещение в одну и ту же очередь)." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "(B) The signal number supplied in I is invalid." msgstr "(B) В I указан некорректный номер сигнала." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy #| msgid "" #| "(B, B, B, B, " #| "B) The kernel detected an inconsistency between the " #| "user-space state at I and the kernel state\\(emthat is, it " #| "detected a waiter which waits in B on I." msgid "" "(B, B, B, B, " "B) The kernel detected an inconsistency between the user-" "space state at I and the kernel state\\[em]that is, it detected a " "waiter which waits in B or B on I." msgstr "" "(B, B, B, B, " "B) Ядро обнаружило противоречие между состояние в " "пользовательском пространстве по адресу I и состоянием в ядре, то " "есть обнаружило, что ожидающий ждёт посредством операции B на " "адресе I." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B, B, B, " "B) The kernel detected an inconsistency between the user-" "space state at I and the kernel state. This indicates either state " "corruption or that the kernel found a waiter on I which is waiting " "via B or B." msgstr "" "(B, B, B, " "B) Ядро обнаружило противоречие между состояние в " "пользовательском пространстве по адресу I и состоянием в ядре. Это " "указывает на поврежденное значение состояния или что ядро обнаружило " "ожидающего на адресе I, который делает это посредством операции " "B или B." #. From a conversation with Thomas Gleixner (Aug 2015): ### #. The kernel sees: I have non PI state for a futex you tried to #. tell me was PI #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B) The kernel detected an inconsistency between the " "user-space state at I and the kernel state; that is, the kernel " "detected a waiter which waits via B or B on " "I." msgstr "" "(B) Ядро обнаружило противоречие между состояние в " "пользовательском пространстве по адресу I и состоянием в ядре, то " "есть обнаружило, что ожидающий ждёт посредством операции B или " "B на адресе I." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B) The kernel detected an inconsistency between the " "user-space state at I and the kernel state; that is, the kernel " "detected a waiter which waits via B or B on " "I." msgstr "" "(B) Ядро обнаружило противоречие между состояние в " "пользовательском пространстве по адресу I и состоянием в ядре, то " "есть обнаружило, что ожидающий ждёт посредством операции B или " "B на адресе I." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy #| msgid "" #| "(B) The kernel detected an inconsistency between " #| "the user-space state at I and the kernel state; that is, the " #| "kernel detected a waiter which waits on I via B " #| "(instead of B)." msgid "" "(B) The kernel detected an inconsistency between the " "user-space state at I and the kernel state; that is, the kernel " "detected a waiter which waits on I via B or " "B (instead of B)." msgstr "" "(B) Ядро обнаружило противоречие между состояние в " "пользовательском пространстве по адресу I и состоянием в ядре, то " "есть обнаружило, что ожидающий ждёт посредством операции B на " "адресе I (вместо B)." #. This deals with the case: #. wait_requeue_pi(A, B); #. requeue_pi(A, C); #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B) An attempt was made to requeue a waiter to a " "futex other than that specified by the matching B " "call for that waiter." msgstr "" "(B) Предпринята попытка выполнить перемещение " "ожидающего на фьютекс, отличный от указанного в соответствующем вызове " "B для этого вызывающего." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "(B) The I argument is not 1." msgstr "(B) Значение аргумента I не равно 1." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "Invalid argument." msgstr "Неверный аргумент." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B) The system-wide limit on the total number of open files has " "been reached." msgstr "" "(B) Достигнуто ограничение на общее количество открытых файлов в " "системе." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B, B, B, " "B) The kernel could not allocate memory to hold state " "information." msgstr "" "(B, B, B, " "B) Ядро не может выделить память для хранения " "информации о состоянии." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "Invalid operation specified in I." msgstr "В I задана неверная операция." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy #| msgid "" #| "The B option was specified in I, but the " #| "accompanying operation was neither B, B, " #| "nor B." msgid "" "The B option was specified in I, but the " "accompanying operation was neither B, B, " "B, nor B." msgstr "" "В I был указан параметр B, но сопутствующая " "операция не равна B, B или " "B." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B, B, B, " "B, B, B) A " "run-time check determined that the operation is not available. The PI-futex " "operations are not implemented on all architectures and are not supported on " "some CPU variants." msgstr "" "(B, B, B, " "B, B, B) " "Проверка во время выполнения обнаружила, что операция недоступна. Операции с " "PI-фьютексами реализованы не на всех архитектурах и не поддерживаются на " "некоторых моделях ЦП." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B, B, B, " "B) The caller is not allowed to attach itself to the " "futex at I (for B: the futex at I). " "(This may be caused by a state corruption in user space.)" msgstr "" "(B, B, B, " "B) Вызывающему запрещено самостоятельно присоединяться " "к фьютексу по адресу I (для B: фьютексу по " "адресу I) (это может быть вызвано повреждением состояния в " "пользовательском пространстве)." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B) The caller does not own the lock represented by the " "futex word." msgstr "" "(B) Вызывающему не принадлежит блокировка, представленная в " "слове фьютекса." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B, B, B, " "B) The thread ID in the futex word at I does " "not exist." msgstr "" "(B, B, B, " "B) Идентификатор нити из слова фьютекса по адресу " "I не существует." #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "(B) The thread ID in the futex word at I does " "not exist." msgstr "" "(B) Идентификатор нити из слова фьютекса по адресу " "I не существует." #. type: TP #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "B" msgstr "B" #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The operation in I employed the timeout specified in I, " "and the timeout expired before the operation completed." msgstr "" "Операция в I использует время ожидания, указанное в I, и " "время истекло до завершения операции." #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "STANDARDS" msgstr "СТАНДАРТЫ" #. type: Plain text #: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron #: opensuse-leap-15-6 opensuse-tumbleweed msgid "Linux." msgstr "Linux." #. type: SH #: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron #: opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "HISTORY" msgstr "ИСТОРИЯ" #. type: Plain text #: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron #: opensuse-leap-15-6 opensuse-tumbleweed msgid "Linux 2.6.0." msgstr "" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Initial futex support was merged in Linux 2.5.7 but with different semantics " "from what was described above. A four-argument system call with the " "semantics described in this page was introduced in Linux 2.5.40. A fifth " "argument was added in Linux 2.5.70, and a sixth argument was added in Linux " "2.6.7." msgstr "" "Начальная поддержка фьютексов была встроена в Linux 2.5.7, но с другой " "семантикой, отличающейся от описанной выше. Семантика системного вызова с " "четырьмя аргументами, описанная в этой странице, появилась в Linux 2.5.40. " "Пятый аргумент была добавлен в Linux 2.5.70, а шестой аргумент был добавлен " "в Linux 2.6.7." #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "EXAMPLES" msgstr "ПРИМЕРЫ" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "The program below demonstrates use of futexes in a program where a parent " "process and a child process use a pair of futexes located inside a shared " "anonymous mapping to synchronize access to a shared resource: the terminal. " "The two processes each write I (a command-line argument that " "defaults to 5 if omitted) messages to the terminal and employ a " "synchronization protocol that ensures that they alternate in writing " "messages. Upon running this program we see output such as the following:" msgstr "" "В программе, показанной далее, показано использование фьютексов: " "родительский и дочерний процессы используют пару фьютексов, расположенных в " "общем анонимном отображении, для синхронизации доступа к общему ресурсу: " "терминалу. Каждый из процессов записывает I (аргумент командной " "строки, если отсутствует, то 5) сообщений на терминал и использует протокол " "синхронизации, который гарантирует, что они записываются поочерёдно. " "Результат работы программы:" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "" "$ B<./futex_demo>\n" "Parent (18534) 0\n" "Child (18535) 0\n" "Parent (18534) 1\n" "Child (18535) 1\n" "Parent (18534) 2\n" "Child (18535) 2\n" "Parent (18534) 3\n" "Child (18535) 3\n" "Parent (18534) 4\n" "Child (18535) 4\n" msgstr "" "$ B<./futex_demo>\n" "Родитель (18534) 0\n" "Потомок (18535) 0\n" "Родитель (18534) 1\n" "Потомок (18535) 1\n" "Родитель (18534) 2\n" "Потомок (18535) 2\n" "Родитель (18534) 3\n" "Потомок (18535) 3\n" "Родитель (18534) 4\n" "Потомок (18535) 4\n" #. type: SS #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "Program source" msgstr "Исходный код программы" #. type: Plain text #: archlinux debian-unstable fedora-40 fedora-rawhide mageia-cauldron #: opensuse-tumbleweed #, no-wrap msgid "" "/* futex_demo.c\n" "\\&\n" " Usage: futex_demo [nloops]\n" " (Default: 5)\n" "\\&\n" " Demonstrate the use of futexes in a program where parent and child\n" " use a pair of futexes located inside a shared anonymous mapping to\n" " synchronize access to a shared resource: the terminal. The two\n" " processes each write \\[aq]num-loops\\[aq] messages to the terminal and employ\n" " a synchronization protocol that ensures that they alternate in\n" " writing messages.\n" "*/\n" "#define _GNU_SOURCE\n" "#include Eerr.hE\n" "#include Eerrno.hE\n" "#include Elinux/futex.hE\n" "#include Estdatomic.hE\n" "#include Estdint.hE\n" "#include Estdio.hE\n" "#include Estdlib.hE\n" "#include Esys/mman.hE\n" "#include Esys/syscall.hE\n" "#include Esys/time.hE\n" "#include Esys/wait.hE\n" "#include Eunistd.hE\n" "\\&\n" "static uint32_t *futex1, *futex2, *iaddr;\n" "\\&\n" "static int\n" "futex(uint32_t *uaddr, int futex_op, uint32_t val,\n" " const struct timespec *timeout, uint32_t *uaddr2, uint32_t val3)\n" "{\n" " return syscall(SYS_futex, uaddr, futex_op, val,\n" " timeout, uaddr2, val3);\n" "}\n" "\\&\n" "/* Acquire the futex pointed to by \\[aq]futexp\\[aq]: wait for its value to\n" " become 1, and then set the value to 0. */\n" "\\&\n" "static void\n" "fwait(uint32_t *futexp)\n" "{\n" " long s;\n" " const uint32_t one = 1;\n" "\\&\n" " /* atomic_compare_exchange_strong(ptr, oldval, newval)\n" " atomically performs the equivalent of:\n" "\\&\n" " if (*ptr == *oldval)\n" " *ptr = newval;\n" "\\&\n" " It returns true if the test yielded true and *ptr was updated. */\n" "\\&\n" " while (1) {\n" "\\&\n" " /* Is the futex available? */\n" " if (atomic_compare_exchange_strong(futexp, &one, 0))\n" " break; /* Yes */\n" "\\&\n" " /* Futex is not available; wait. */\n" "\\&\n" " s = futex(futexp, FUTEX_WAIT, 0, NULL, NULL, 0);\n" " if (s == -1 && errno != EAGAIN)\n" " err(EXIT_FAILURE, \"futex-FUTEX_WAIT\");\n" " }\n" "}\n" "\\&\n" "/* Release the futex pointed to by \\[aq]futexp\\[aq]: if the futex currently\n" " has the value 0, set its value to 1 and then wake any futex waiters,\n" " so that if the peer is blocked in fwait(), it can proceed. */\n" "\\&\n" "static void\n" "fpost(uint32_t *futexp)\n" "{\n" " long s;\n" " const uint32_t zero = 0;\n" "\\&\n" " /* atomic_compare_exchange_strong() was described\n" " in comments above. */\n" "\\&\n" " if (atomic_compare_exchange_strong(futexp, &zero, 1)) {\n" " s = futex(futexp, FUTEX_WAKE, 1, NULL, NULL, 0);\n" " if (s == -1)\n" " err(EXIT_FAILURE, \"futex-FUTEX_WAKE\");\n" " }\n" "}\n" "\\&\n" "int\n" "main(int argc, char *argv[])\n" "{\n" " pid_t childPid;\n" " unsigned int nloops;\n" "\\&\n" " setbuf(stdout, NULL);\n" "\\&\n" " nloops = (argc E 1) ? atoi(argv[1]) : 5;\n" "\\&\n" " /* Create a shared anonymous mapping that will hold the futexes.\n" " Since the futexes are being shared between processes, we\n" " subsequently use the \"shared\" futex operations (i.e., not the\n" " ones suffixed \"_PRIVATE\"). */\n" "\\&\n" " iaddr = mmap(NULL, sizeof(*iaddr) * 2, PROT_READ | PROT_WRITE,\n" " MAP_ANONYMOUS | MAP_SHARED, -1, 0);\n" " if (iaddr == MAP_FAILED)\n" " err(EXIT_FAILURE, \"mmap\");\n" "\\&\n" " futex1 = &iaddr[0];\n" " futex2 = &iaddr[1];\n" "\\&\n" " *futex1 = 0; /* State: unavailable */\n" " *futex2 = 1; /* State: available */\n" "\\&\n" " /* Create a child process that inherits the shared anonymous\n" " mapping. */\n" "\\&\n" " childPid = fork();\n" " if (childPid == -1)\n" " err(EXIT_FAILURE, \"fork\");\n" "\\&\n" " if (childPid == 0) { /* Child */\n" " for (unsigned int j = 0; j E nloops; j++) {\n" " fwait(futex1);\n" " printf(\"Child (%jd) %u\\en\", (intmax_t) getpid(), j);\n" " fpost(futex2);\n" " }\n" "\\&\n" " exit(EXIT_SUCCESS);\n" " }\n" "\\&\n" " /* Parent falls through to here. */\n" "\\&\n" " for (unsigned int j = 0; j E nloops; j++) {\n" " fwait(futex2);\n" " printf(\"Parent (%jd) %u\\en\", (intmax_t) getpid(), j);\n" " fpost(futex1);\n" " }\n" "\\&\n" " wait(NULL);\n" "\\&\n" " exit(EXIT_SUCCESS);\n" "}\n" msgstr "" #. SRC END #. type: SH #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, no-wrap msgid "SEE ALSO" msgstr "СМОТРИТЕ ТАКЖЕ" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "B(2), B(2), " "B(3), B(7), B(7)" msgstr "" "B(2), B(2), " "B(3), B(7), B(7)" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "The following kernel source files:" msgstr "Файлы из дерева исходного кода ядра:" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "I" msgstr "I" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "I" msgstr "I" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "I" msgstr "I" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "I" msgstr "I" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "I" msgstr "I" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Franke, H., Russell, R., and Kirwood, M., 2002. I (from proceedings of the Ottawa " "Linux Symposium 2002)," msgstr "" "Franke, H., Russell, R., and Kirwood, M., 2002. I (доклад на симпозиуме по Linux в " "2002 году)," #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "E<.UR http://kernel.org\\:/doc\\:/ols\\:/2002\\:/ols2002-pages-479-495.pdf> " "E<.UE>" msgstr "" "E<.UR http://kernel.org\\:/doc\\:/ols\\:/2002\\:/ols2002-pages-479-495.pdf> " "E<.UE>" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Hart, D., 2009. I, E<.UR http://lwn.net/" "Articles/360699/> E<.UE>" msgstr "" "Hart, D., 2009. I, E<.UR http://lwn.net/" "Articles/360699/> E<.UE>" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed #, fuzzy #| msgid "" #| "Hart, D.\\& and Guniguntala, D., 2009. I (from proceedings of the 2009 Real-Time Linux " #| "Workshop), E<.UR http://lwn.net/images/conf/rtlws11/papers/proc/p10.pdf> " #| "E<.UE>" msgid "" "Hart, D.\\& and Guniguntala, D., 2009. I (from proceedings of the 2009 Real-Time Linux Workshop), E<.UR " "http://lwn.net/images/conf/rtlws11/papers/proc/p10.pdf> E<.UE>" msgstr "" "Hart, D.\\& и Guniguntala, D., 2009. I (доклад на Real-Time Linux Workshop в 2009 году), E<.UR http://lwn." "net/images/conf/rtlws11/papers/proc/p10.pdf> E<.UE>" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "Drepper, U., 2011. I, E<.UR http://www.akkadia.org/" "drepper/futex.pdf> E<.UE>" msgstr "" "Drepper, U., 2011. I, E<.UR http://www.akkadia.org/" "drepper/futex.pdf> E<.UE>" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "Futex example library, futex-*.tar.bz2 at" msgstr "Пример библиотеки futex, futex-*.tar.bz2, доступен на" #. type: Plain text #: archlinux debian-bookworm debian-unstable fedora-40 fedora-rawhide #: mageia-cauldron opensuse-leap-15-6 opensuse-tumbleweed msgid "" "E<.UR https://mirrors.kernel.org\\:/pub\\:/linux\\:/kernel\\:/people\\:/" "rusty/> E<.UE>" msgstr "" "E<.UR https://mirrors.kernel.org\\:/pub\\:/linux\\:/kernel\\:/people\\:/" "rusty/> E<.UE>" #. type: TH #: debian-bookworm #, no-wrap msgid "2023-02-05" msgstr "5 февраля 2023 г." #. type: TH #: debian-bookworm #, no-wrap msgid "Linux man-pages 6.03" msgstr "Linux man-pages 6.03" #. type: SH #: debian-bookworm #, no-wrap msgid "VERSIONS" msgstr "ВЕРСИИ" #. type: Plain text #: debian-bookworm msgid "" "Futexes were first made available in a stable kernel release with Linux " "2.6.0." msgstr "Фьютексы появились в стабильном ядре Linux версии 2.6.0." #. type: Plain text #: debian-bookworm msgid "This system call is Linux-specific." msgstr "Данный вызов есть только в Linux." #. type: SH #: debian-bookworm #, no-wrap msgid "NOTES" msgstr "ПРИМЕЧАНИЯ" #. TODO FIXME(Torvald) Above, we cite this section and claim it contains #. details on the synchronization semantics; add the C11 equivalents #. here (or whatever we find consensus for). #. """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" #. type: Plain text #: debian-bookworm msgid "" "Several higher-level programming abstractions are implemented via futexes, " "including POSIX semaphores and various POSIX threads synchronization " "mechanisms (mutexes, condition variables, read-write locks, and barriers)." msgstr "" "На основе фьютексов было реализовано несколько высокоуровневых программных " "абстракций, например, семафоры POSIX и различные механизмы синхронизации " "нитей POSIX (мьютексы, переменные условий, блокировки чтения-записи и " "барьеры)." #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "/* futex_demo.c\n" msgstr "/* futex_demo.c\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " Usage: futex_demo [nloops]\n" " (Default: 5)\n" msgstr "" " Использование: futex_demo [nloops]\n" " (по умолчанию: 5)\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, fuzzy, no-wrap #| msgid "" #| " Demonstrate the use of futexes in a program where parent and child\n" #| " use a pair of futexes located inside a shared anonymous mapping to\n" #| " synchronize access to a shared resource: the terminal. The two\n" #| " processes each write \\(aqnum-loops\\(aq messages to the terminal and employ\n" #| " a synchronization protocol that ensures that they alternate in\n" #| " writing messages.\n" #| "*/\n" #| "#define _GNU_SOURCE\n" #| "#include Eerr.hE\n" #| "#include Eerrno.hE\n" #| "#include Elinux/futex.hE\n" #| "#include Estdatomic.hE\n" #| "#include Estdint.hE\n" #| "#include Estdio.hE\n" #| "#include Estdlib.hE\n" #| "#include Esys/mman.hE\n" #| "#include Esys/syscall.hE\n" #| "#include Esys/time.hE\n" #| "#include Esys/wait.hE\n" #| "#include Eunistd.hE\n" msgid "" " Demonstrate the use of futexes in a program where parent and child\n" " use a pair of futexes located inside a shared anonymous mapping to\n" " synchronize access to a shared resource: the terminal. The two\n" " processes each write \\[aq]num-loops\\[aq] messages to the terminal and employ\n" " a synchronization protocol that ensures that they alternate in\n" " writing messages.\n" "*/\n" "#define _GNU_SOURCE\n" "#include Eerr.hE\n" "#include Eerrno.hE\n" "#include Elinux/futex.hE\n" "#include Estdatomic.hE\n" "#include Estdint.hE\n" "#include Estdio.hE\n" "#include Estdlib.hE\n" "#include Esys/mman.hE\n" "#include Esys/syscall.hE\n" "#include Esys/time.hE\n" "#include Esys/wait.hE\n" "#include Eunistd.hE\n" msgstr "" " Продемонстрировано использование фьютексов в программе, где родитель\n" " и потомок используют пару фьютексов, расположенных в общем анонимном\n" " отображении, для синхронизации доступа к общему ресурсу: терминалу.\n" " Каждый из процессов записывает I на терминал и использует\n" " протокол синхронизации, который гарантирует, что они выполняют запись\n" " поочерёдно.\n" "*/\n" "#define _GNU_SOURCE\n" "#include Eerr.hE\n" "#include Eerrno.hE\n" "#include Elinux/futex.hE\n" "#include Estdatomic.hE\n" "#include Estdint.hE\n" "#include Estdio.hE\n" "#include Estdlib.hE\n" "#include Esys/mman.hE\n" "#include Esys/syscall.hE\n" "#include Esys/time.hE\n" "#include Esys/wait.hE\n" "#include Eunistd.hE\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "static uint32_t *futex1, *futex2, *iaddr;\n" msgstr "static uint32_t *futex1, *futex2, *iaddr;\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" "static int\n" "futex(uint32_t *uaddr, int futex_op, uint32_t val,\n" " const struct timespec *timeout, uint32_t *uaddr2, uint32_t val3)\n" "{\n" " return syscall(SYS_futex, uaddr, futex_op, val,\n" " timeout, uaddr2, val3);\n" "}\n" msgstr "" "static int\n" "futex(uint32_t *uaddr, int futex_op, uint32_t val,\n" " const struct timespec *timeout, uint32_t *uaddr2, uint32_t val3)\n" "{\n" " return syscall(SYS_futex, uaddr, futex_op, val,\n" " timeout, uaddr2, val3);\n" "}\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, fuzzy, no-wrap #| msgid "" #| "/* Acquire the futex pointed to by \\(aqfutexp\\(aq: wait for its value to\n" #| " become 1, and then set the value to 0. */\n" msgid "" "/* Acquire the futex pointed to by \\[aq]futexp\\[aq]: wait for its value to\n" " become 1, and then set the value to 0. */\n" msgstr "" "/* Получить фьютекс, указанный \\(aqfutexp\\(aq: подождать пока его\n" " значение не станет 1, и изменить значение на 0. */\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" "static void\n" "fwait(uint32_t *futexp)\n" "{\n" " long s;\n" " const uint32_t one = 1;\n" msgstr "" "static void\n" "fwait(uint32_t *futexp)\n" "{\n" " long s;\n" " const uint32_t one = 1;\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " /* atomic_compare_exchange_strong(ptr, oldval, newval)\n" " atomically performs the equivalent of:\n" msgstr "" " /* atomic_compare_exchange_strong(ptr, oldval, newval)\n" " атомарно выполняет эквивалент кода:\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " if (*ptr == *oldval)\n" " *ptr = newval;\n" msgstr "" " if (*ptr == *oldval)\n" " *ptr = newval;\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " It returns true if the test yielded true and *ptr was updated. */\n" msgstr " Она возвращает true, если тест вернул true и было обновлено *ptr.\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " while (1) {\n" msgstr " while (1) {\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " /* Is the futex available? */\n" " if (atomic_compare_exchange_strong(futexp, &one, 0))\n" " break; /* Yes */\n" msgstr "" " /* фьютекс доступен? */\n" " if (atomic_compare_exchange_strong(futexp, &one, 0))\n" " break; /* да */\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " /* Futex is not available; wait. */\n" msgstr " /* фьютекс недоступен, ждём. */\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " s = futex(futexp, FUTEX_WAIT, 0, NULL, NULL, 0);\n" " if (s == -1 && errno != EAGAIN)\n" " err(EXIT_FAILURE, \"futex-FUTEX_WAIT\");\n" " }\n" "}\n" msgstr "" " s = futex(futexp, FUTEX_WAIT, 0, NULL, NULL, 0);\n" " if (s == -1 && errno != EAGAIN)\n" " err(EXIT_FAILURE, \"futex-FUTEX_WAIT\");\n" " }\n" "}\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, fuzzy, no-wrap #| msgid "" #| "/* Release the futex pointed to by \\(aqfutexp\\(aq: if the futex currently\n" #| " has the value 0, set its value to 1 and the wake any futex waiters,\n" #| " so that if the peer is blocked in fpost(), it can proceed. */\n" msgid "" "/* Release the futex pointed to by \\[aq]futexp\\[aq]: if the futex currently\n" " has the value 0, set its value to 1 and then wake any futex waiters,\n" " so that if the peer is blocked in fwait(), it can proceed. */\n" msgstr "" "/* Освобождаем фьютекс, указанный в \\(aqfutexp\\(aq: если значение фьютекса\n" " сейчас равно 0, то присваиваем ему 1 и пробуждаем ожидающий фьютекса,\n" " то есть, если вторая сторона заблокирована в fpost(), то она может\n" " продолжить работу. */\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" "static void\n" "fpost(uint32_t *futexp)\n" "{\n" " long s;\n" " const uint32_t zero = 0;\n" msgstr "" "static void\n" "fpost(uint32_t *futexp)\n" "{\n" " long s;\n" " const uint32_t zero = 0;\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " /* atomic_compare_exchange_strong() was described\n" " in comments above. */\n" msgstr "" " /* atomic_compare_exchange_strong() описан\n" " в комментария выше */\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " if (atomic_compare_exchange_strong(futexp, &zero, 1)) {\n" " s = futex(futexp, FUTEX_WAKE, 1, NULL, NULL, 0);\n" " if (s == -1)\n" " err(EXIT_FAILURE, \"futex-FUTEX_WAKE\");\n" " }\n" "}\n" msgstr "" " if (atomic_compare_exchange_strong(futexp, &zero, 1)) {\n" " s = futex(futexp, FUTEX_WAKE, 1, NULL, NULL, 0);\n" " if (s == -1)\n" " err(EXIT_FAILURE, \"futex-FUTEX_WAKE\");\n" " }\n" "}\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" "int\n" "main(int argc, char *argv[])\n" "{\n" " pid_t childPid;\n" " unsigned int nloops;\n" msgstr "" "int\n" "main(int argc, char *argv[])\n" "{\n" " pid_t childPid;\n" " unsigned int nloops;\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " setbuf(stdout, NULL);\n" msgstr " setbuf(stdout, NULL);\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " nloops = (argc E 1) ? atoi(argv[1]) : 5;\n" msgstr " nloops = (argc E 1) ? atoi(argv[1]) : 5;\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " /* Create a shared anonymous mapping that will hold the futexes.\n" " Since the futexes are being shared between processes, we\n" " subsequently use the \"shared\" futex operations (i.e., not the\n" " ones suffixed \"_PRIVATE\"). */\n" msgstr "" " /* Создаём общее анонимное отображение, в котором будем хранить\n" " фьютексы. Так как фьютексы совместно используются процессами,\n" " воспользуемся операциями с «общими» фьютексами (т. е., без\n" " суффикса «_PRIVATE»). */\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " iaddr = mmap(NULL, sizeof(*iaddr) * 2, PROT_READ | PROT_WRITE,\n" " MAP_ANONYMOUS | MAP_SHARED, -1, 0);\n" " if (iaddr == MAP_FAILED)\n" " err(EXIT_FAILURE, \"mmap\");\n" msgstr "" " iaddr = mmap(NULL, sizeof(*iaddr) * 2, PROT_READ | PROT_WRITE,\n" " MAP_ANONYMOUS | MAP_SHARED, -1, 0);\n" " if (iaddr == MAP_FAILED)\n" " err(EXIT_FAILURE, \"mmap\");\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " futex1 = &iaddr[0];\n" " futex2 = &iaddr[1];\n" msgstr "" " futex1 = &iaddr[0];\n" " futex2 = &iaddr[1];\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " *futex1 = 0; /* State: unavailable */\n" " *futex2 = 1; /* State: available */\n" msgstr "" " *futex1 = 0; /* Состояние: недоступен */\n" " *futex2 = 1; /* Состояние: доступен */\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " /* Create a child process that inherits the shared anonymous\n" " mapping. */\n" msgstr "" " /* Создаём дочерний процесс, который наследует общее анонимное\n" " отображение. */\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " childPid = fork();\n" " if (childPid == -1)\n" " err(EXIT_FAILURE, \"fork\");\n" msgstr "" " childPid = fork();\n" " if (childPid == -1)\n" " err(EXIT_FAILURE, \"fork\");\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, fuzzy, no-wrap #| msgid "" #| " if (childPid == 0) { /* Child */\n" #| " for (j = 0; j E nloops; j++) {\n" #| " fwait(futex1);\n" #| " printf(\"Child (%ld) %d\\en\", (long) getpid(), j);\n" #| " fpost(futex2);\n" #| " }\n" msgid "" " if (childPid == 0) { /* Child */\n" " for (unsigned int j = 0; j E nloops; j++) {\n" " fwait(futex1);\n" " printf(\"Child (%jd) %u\\en\", (intmax_t) getpid(), j);\n" " fpost(futex2);\n" " }\n" msgstr "" " if (childPid == 0) { /* Child */\n" " for (j = 0; j E nloops; j++) {\n" " fwait(futex1);\n" " printf(\"Потомок (%ld) %d\\en\", (long) getpid(), j);\n" " fpost(futex2);\n" " }\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " exit(EXIT_SUCCESS);\n" " }\n" msgstr "" " exit(EXIT_SUCCESS);\n" " }\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " /* Parent falls through to here. */\n" msgstr " /* предок попадает сюда. */\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " for (unsigned int j = 0; j E nloops; j++) {\n" " fwait(futex2);\n" " printf(\"Parent (%jd) %u\\en\", (intmax_t) getpid(), j);\n" " fpost(futex1);\n" " }\n" msgstr "" " for (unsigned int j = 0; j E nloops; j++) {\n" " fwait(futex2);\n" " printf(\"Parent (%jd) %u\\en\", (intmax_t) getpid(), j);\n" " fpost(futex1);\n" " }\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid " wait(NULL);\n" msgstr " wait(NULL);\n" #. type: Plain text #: debian-bookworm opensuse-leap-15-6 #, no-wrap msgid "" " exit(EXIT_SUCCESS);\n" "}\n" msgstr "" " exit(EXIT_SUCCESS);\n" "}\n" #. type: TH #: fedora-40 fedora-rawhide mageia-cauldron #, no-wrap msgid "2023-10-31" msgstr "31 октября 2023 г." #. type: TH #: fedora-40 mageia-cauldron #, no-wrap msgid "Linux man-pages 6.06" msgstr "Linux man-pages 6.06" #. type: TH #: fedora-rawhide #, no-wrap msgid "Linux man-pages 6.7" msgstr "Linux man-pages 6.7" #. type: TH #: opensuse-leap-15-6 #, no-wrap msgid "2023-03-30" msgstr "30 марта 2023 г." #. type: TH #: opensuse-leap-15-6 #, no-wrap msgid "Linux man-pages 6.04" msgstr "Linux man-pages 6.04" #. type: TH #: opensuse-tumbleweed #, fuzzy, no-wrap #| msgid "Linux man-pages 6.7" msgid "Linux man-pages (unreleased)" msgstr "Linux man-pages 6.7"