Namespaces
Variants

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)

Смотрите также