call_once, once_flag, ONCE_FLAG_INIT
Определено в заголовке <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 |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/thread/call_once