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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
/*
*******************************************************************************
\file mt.h
\brief Multithreading
\project bee2 [cryptographic library]
\created 2014.10.10
\version 2023.02.02
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
*/
/*!
*******************************************************************************
\file mt.h
\brief Поддержка многозадачности
\pre Все входные указатели действительны, если не оговорено противное.
*******************************************************************************
*/
extern "C" OS_WIN
typedef CRITICAL_SECTION mt_mtx_t;
typedef pthread_mutex_t mt_mtx_t;
typedef bool_t mt_mtx_t;
/*! \brief Создание мьютекса
Создается мьютекс mtx.
\return Признак успеха.
\post В случае успеха мьютекс корректен.
*/
bool_t ;
/*! \brief Корректный мьютекс?
Проверяется корректность мьютекса mtx.
\return Признак корректности.
*/
bool_t ;
/*! \brief Блокировка мьютекса
Мьютекс mtx блокируется.
\pre Мьютекс корректен.
\remark Если мьютекс заблокирован в момент вызова, то ожидается снятие
блокировки (в другом потоке).
*/
void ;
/*! \brief Разблокировка мьютекса
Мьютекс mtx разблокируется.
\pre mtMtxUnlock() < mtMtxLock().
\pre Мьютекс корректен.
*/
void ;
/*! \brief Закрытие мьютекса
Мьютекс mtx закрывается.
\pre Мьютекс корректен и не заблокирован.
\pre mtMtxClose() < mtMtxCreate().
\remark Закрытие заблокированного мьютекса может привести к непредсказуемым
последствиям.
*/
void ;
/*!
*******************************************************************************
\file mt.h
\section mt-thrd Управление потоками
Управление потоками реализуется по схемам, заданным в стандарте языка Си
ISO/IEC 9899:2011 (см. заголовочный файл threads.h).
*******************************************************************************
*/
/*! \brief Приостановка потока
Текущий поток приостанавливается на ms миллисекунд.
\remark 1 секунда = 10^3 миллисекунд = 10^6 микросекунд = 10^9 наносекунд.
\remark Если операционная система не распознана или операционная система
не поддерживает многозадачность, то приостановки не будет.
*/
void ;
/*! \brief Вызов один раз
Функция fn() вызывается в точности один раз даже в ситуации конкурентных
запросов на вызов из разных потоков. Для контроля однократности вызова
используется триггер once, первоначально нулевой.
\expect Триггер once инициализируется нулем и не меняется за пределами
функции.
\return TRUE, если fn() успешно вызвана в данном или предыдущем обращении
к mtCallOnce(), и FALSE в противном случае.
*/
bool_t ;
/*!
*******************************************************************************
\file mt.h
\section mt-atomic Элементарные атомарные операции
Операции выполняются над счетчиками типа size_t, представленными указателями.
Операции атомарны в том смысле, что счетчик защищен от изменения в других
потоках вплоть до завершения операции.
\warning Если указатель на счетчик не выровнен на границу size_t, то поведение
функций может быть непредсказуемым.
*******************************************************************************
*/
/*! \brief Атомарный инкремент
Счетчик ctr атомарно увеличивается на 1.
\remark Возможно переполнение (сверху, overflow).
\return Новое значение счетчика.
*/
size_t ;
/*! \brief Атомарный декремент
Счетчик ctr атомарно уменьшается на 1.
\remark Возможно переполнение (снизу, undeflow).
\return Новое значение счетчика.
*/
size_t ;
/*! \brief Атомарное сравнение с заменой
Счетчик ctr атомарно сравнивается с cmp и, в случае совпадения,
устанавливается равным swap.
\return Первоначальное значение счетчика.
*/
size_t ;
} /* extern "C" */
/* __BEE2_MT_H */