close
Пространства имён
Варианты
Действия

std::call_once

Материал из cppreference.com

<metanoindex/>

 
 
Библиотека поддержки конкуренции
Ветви
(C++11)
(C++20)
(C++20)
Пространство имён this_thread
(C++11)
(C++11)
(C++11)
Атомарные типы
(C++11)
(C++20)
Инициализация атомарных типов
(C++11)(устарело в C++20)
(C++11)(устарело в C++20)
(C++11)(устарело в C++20)
Функции освобождения для атомарных операций
Функции освобождения для атомарных флагов
Упорядочивание памяти
Взаимное исключение
(C++11)
Общее управление блокировкой
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
Условные переменные
(C++11)
Семафоры
Защёлки и барьеры
(C++20)
(C++20)
Фьючерсы
(C++11)
(C++11)
(C++11)
(C++11)
 
<tbody> </tbody>
Определено в заголовочном файле <mutex>
template< class Function, class... Args > void call_once( std::once_flag& flag, Function&& f, Args&& args... );
(начиная с C++11)
Выполняет функции f только один раз, даже если вызывать из нескольких потоков.
Оригинал:
Executes the function f exactly once, even if called from several threads.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Каждая группа call_once вызова, который получает тот же объект std::once_flag будет отвечать следующим требованиям:
Оригинал:
Each group of call_once invocations that receives the same std::once_flag object will meet the following requirements:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Ровно исполнения ровно одна из функций (передается как f на вызовы в группе) не выполняется. Не определено, какие функции будут отобраны для исполнения. Выбранная функция выполняется в том же потоке, что и call_once вызов был передан.
    Оригинал:
    Exactly one execution of exactly one of the functions (passed as f to the invocations in the group) is performed. It is undefined which function will be selected for execution. The selected function runs in the same thread as the call_once invocation it was passed to.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Нет вызова в группу возвращается до вышеуказанного исполнения Выбранная функция завершилась успешно, то есть не выходить через исключение.
    Оригинал:
    No invocation in the group returns before the abovementioned execution of the selected function is completed successfully, that is, doesn't exit via an exception.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Если выбранная функция выходит через исключение, оно распространяется на абонентов. Еще одна функция, затем выбирается и выполняется.
    Оригинал:
    If the selected function exits via exception, it is propagated to the caller. Another function is then selected and executed.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Параметры

flag
Объект, для которого ровно одна функция запускается на выполнение
Оригинал:
an object, for which exactly one function gets executed
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
f
функции для вызова
Оригинал:
function to call
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
args...
Аргументы для передачи в функцию
Оригинал:
arguments to pass to the function
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Возвращаемое значение

(Нет)

Исключения

  • std::system_error если условие не позволяет звонки на call_once от исполнения, как указано
    Оригинал:
    std::system_error if any condition prevents calls to call_once from executing as specified
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • любое исключение по f
    Оригинал:
    any exception thrown by f
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Пример

#include <iostream>
#include <thread>
#include <mutex>

std::once_flag flag;

void do_once()
{
    std::call_once(flag, [](){ std::cout << "Called once" << std::endl; });
}

int main()
{
    std::thread t1(do_once);
    std::thread t2(do_once);
    std::thread t3(do_once);
    std::thread t4(do_once);

    t1.join();
    t2.join();
    t3.join();
    t4.join();
}

Вывод:

Called once

См. также

(C++11)
вспомогательный объект, гарантирующий, что call_once вызывает функцию только один раз
(класс) [править]