set_tid_address(2)

НАИМЕНОВАНИЕ
set_tid_address - устанавливает указатель идентификатора нити

БИБЛИОТЕКА
Standard C library (libc, -lc)

ОБЗОР
#include <sys/syscall.h>      /* определения констант SYS_* */
#include <unistd.h>

pid_t syscall(SYS_set_tid_address, int *tidptr);

Note: glibc provides no wrapper for set_tid_address(), necessitating the use of syscall(2).

ОПИСАНИЕ
В ядре для каждой нити хранится два атрибута (адреса): set_child_tid и clear_child_tid. Их значение по умолчанию равно NULL.

set_child_tid
    Если нить запущена с помощью clone(2) с флагом CLONE_CHILD_SETTID, то значение set_child_tid устанавливается равным аргументу системного вызова ctid.

    Если set_child_tid присвоено значение, то самое первое действие, которое выполняется для новой нити, это запись ID нити по этому адресу.

clear_child_tid
    Если нить запущена с помощью clone(2) с флагом CLONE_CHILD_CLEARTID, то значение clear_child_tid устанавливается равным аргументу системного вызова ctid.

Системный вызов set_tid_address() устанавливает у вызывающей нити значение clear_child_tid равным tidptr.

Если нить, чьё значение clear_child_tid не равно NULL, завершается и если нить использовала общую память с другими нитями, то по адресу, указанному в clear_child_tid, записывается 0 и ядро выполняет следующую операцию:

    futex(clear_child_tid, FUTEX_WAKE, 1, NULL, NULL, 0);

Действие этой операции в том, что она пробуждает единственную нить, выполнявшую ожидание futex на расположение памяти. Ошибки операции пробуждения futex игнорируются.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Вызов set_tid_address() всегда возвращает ID вызывающей нити.

ОШИБКИ
Вызов set_tid_address() всегда завершается без ошибок.

СТАНДАРТЫ
Linux.

ИСТОРИЯ
Linux 2.5.48.

Details as given here are valid since Linux 2.5.49.

СМОТРИТЕ ТАКЖЕ
clone(2), futex(2), gettid(2)

ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Alexander Golubev <fatzer2@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Hotellook, Nikita <zxcvbnm3230@mail.ru>, Spiros Georgaras <sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (<debian-l10n-russian@lists.debian.org>).