1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
.TH MPU_FLOCKFILE 3 "Август 2026" "libmpuio" "Руководство программиста LIBMPUIO"
.SH ИМЯ
mpu_flockfile, mpu_ftrylockfile, mpu_funlockfile \- блокировка потока LIBMPUIO
.SH ОБЗОР
.nf
#include <libmpuio.h>
void mpu_flockfile( mpu_FILE *stream );
int mpu_ftrylockfile( mpu_FILE *stream );
void mpu_funlockfile( mpu_FILE *stream );
.fi
.SH ОПИСАНИЕ
.BR mpu_flockfile ()
блокирует
.I stream
для эксклюзивного использования вызывающим потоком выполнения. Если
блокировкой потока владеет другой поток выполнения, вызов ожидает её
освобождения.
.PP
Блокировки потоков LIBMPUIO рекурсивны. Владеющий поток выполнения может
повторно вызвать
.BR mpu_flockfile (),
а также вызывать обычные блокируемые потоковые функции, например
.BR mpu_fputc (3)
или
.BR mpu_fprintf (3),
пока удерживается явная блокировка. Блокировка освобождается соответствующим
числом вызовов
.BR mpu_funlockfile ().
.PP
.BR mpu_ftrylockfile ()
выполняет ту же попытку захвата без ожидания.
.BR mpu_funlockfile ()
освобождает один уровень владения вызывающим потоком выполнения.
.SH ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
.BR mpu_ftrylockfile ()
возвращает ноль, если блокировка захвачена. Если захват невозможен, функция
возвращает ненулевой номер ошибки pthread.
.PP
.BR mpu_flockfile ()
и
.BR mpu_funlockfile ()
не возвращают значения.
.SH ОШИБКИ
Для недопустимого потока LIBMPUIO устанавливает
.BR errno .
Ошибка операции блокировки pthread также отражается в
.BR errno .
.SH ПРИМЕЧАНИЯ
Блокировка защищает объект
.BR mpu_FILE ,
включая его состояние буферизации, состояние преобразования UTF-8/UCS-2 и
операции форматированного ввода-вывода. Она не обеспечивает консультативную
или обязательную блокировку нижележащего объекта файловой системы.
.SH СВЯЗЬ С ФУНКЦИЯМИ _UNLOCKED
Основное назначение этого семейства \- создание атомарного участка,
содержащего несколько unlocked-операций. Unlocked-функции пропускают только
неявный mutex потока; все правила преобразования, буферизации, проверки,
возвращаемых значений, errno, EOF и индикатора ошибки остаются без изменений.
.PP
Mutex рекурсивен. Поэтому обычная блокируемая функция LIBMPUIO может быть
вызвана потоком выполнения, который уже владеет блокировкой потока, хотя
использование соответствующей unlocked-формы позволяет избежать избыточной
рекурсивной блокировки.
.SH ГЛОБАЛЬНЫЙ СПИСОК ПОТОКОВ
Внутренний список всех потоков защищается отдельно от mutex отдельных потоков.
Внутренний код использует фиксированный порядок: сначала блокировка глобального
списка, затем блокировка потока. Это защищает mpu_fflush(NULL) от параллельного
удаления потока. Код приложения не управляет блокировкой списка напрямую.
.SH ПРАВИЛО ЖИЗНЕННОГО ЦИКЛА
Явная блокировка потока не превращает устаревший указатель в допустимый поток.
Приложение должно гарантировать, что mpu_fclose() не сможет уничтожить поток,
пока другой поток выполнения ещё может попытаться заблокировать или
использовать этот указатель.
.SH СМ. ТАКЖЕ
.BR libmpuio (3),
.BR mpu_fopen (3),
.BR mpu_printf (3),
.BR mpu_scanf (3)
.SH БЛОКИРОВКА ГЛОБАЛЬНОГО СПИСКА ПОТОКОВ
LIBMPUIO использует внутреннюю блокировку глобального списка для сериализации
mpu_fflush(NULL), добавления и удаления потоков. Внутренний порядок блокировок:
сначала глобальный список, затем отдельный поток. mpu_fclose() следует этому
порядку и удаляет поток из списка до I/O, выполняемого при закрытии, и до
уничтожения. Пользовательский код не имеет прямого доступа к блокировке
глобального списка и не должен пытаться определять или удерживать её через
публичные интерфейсы.
|