Spec-Zone.ru › C

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API