call_once, once_flag, ONCE_FLAG_INIT
From cppreference.net
|
Определено в заголовочном файле
<threads.h>
|
||
|
void
call_once
(
once_flag
*
flag,
void
(
*
func
)
(
void
)
)
;
|
(1) | (начиная с C11) |
|
typedef
/* unspecified */
once_flag
|
(2) | (начиная с C11) |
|
#define ONCE_FLAG_INIT /* unspecified */
|
(3) | (начиная с C11) |
1)
Вызывает функцию
func
ровно один раз, даже если вызов происходит из нескольких потоков. Завершение функции
func
синхронизируется со всеми предыдущими или последующими вызовами
call_once
с той же переменной
flag
.
2)
Полный тип объекта, способный содержать флаг, используемый функцией
call_once
.
3)
Раскрывается в значение, которое может быть использовано для инициализации объекта типа
once_flag
.
Содержание |
Параметры
| flag | - |
указатель на объект типа
call_once
, который используется для гарантии того, что
func
будет вызвана только один раз
|
| func | - | функция, которая должна быть выполнена только один раз |
Возвращаемое значение
(нет)
Примечания
Эквивалентом этой функции в POSIX является
pthread_once
.
Пример
Запустить этот код
#include <stdio.h> #include <threads.h> void do_once(void) { puts("called once"); } static once_flag flag = ONCE_FLAG_INIT; int func(void* data) { call_once(&flag, do_once); } int main(void) { thrd_t t1, t2, t3, t4; thrd_create(&t1, func, NULL); thrd_create(&t2, func, NULL); thrd_create(&t3, func, NULL); thrd_create(&t4, func, NULL); thrd_join(t1, NULL); thrd_join(t2, NULL); thrd_join(t3, NULL); thrd_join(t4, NULL); }
Вывод:
called once
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.26.2.1 Функция call_once (стр: 275)
-
- 7.26.1/3 ONCE_FLAG_INIT (стр: 274)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.26.2.1 Функция call_once (стр: 378)
-
- 7.26.1/3 ONCE_FLAG_INIT (стр: 376)
Смотрите также
|
C++ документация
для
call_once
|