Namespaces
Variants

std:: promise

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
promise
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Определено в заголовочном файле <future>
template < class R > class promise ;
(1) (начиная с C++11)
template < class R > class promise < R & > ;
(2) (начиная с C++11)
template <> class promise < void > ;
(3) (начиная с C++11)
1) Базовый шаблон.
2) Не-void специализация, используется для передачи объектов между потоками.
3) void специализация, используется для передачи событий без состояния.

Шаблон класса std::promise предоставляет механизм для сохранения значения или исключения, которое впоследствии асинхронно получается через объект std::future , созданный объектом std::promise . Следует отметить, что объект std::promise предназначен для однократного использования.

Каждое обещание связано с shared state , который содержит информацию о состоянии и result , который может быть ещё не вычислен, вычислен в значение (возможно, void) или вычислен в исключение. Обещание может делать три вещи с shared state:

  • make ready : промис сохраняет результат или исключение в общем состоянии. Помечает состояние готовым и разблокирует любые потоки, ожидающие на future, связанном с общим состоянием.
  • release : промис отказывается от своей ссылки на общее состояние. Если это была последняя такая ссылка, общее состояние уничтожается. Если только это не было общее состояние, созданное std:: async которое еще не готово, эта операция не блокирует.
  • abandon : промис сохраняет исключение типа std::future_error с кодом ошибки std::future_errc::broken_promise , переводит общее состояние в готовое , а затем освобождает его.

Промис (promise) представляет собой "отправляющий" конец канала связи promise-future: операция, которая сохраняет значение в общем состоянии, синхронизируется-с (как определено в std::memory_order ) успешным возвратом из любой функции, ожидающей общее состояние (такой как std::future::get ). Конкурентный доступ к тому же общему состоянию может привести к конфликту в противном случае: например, множественные вызовы std::shared_future::get должны быть либо все только для чтения, либо обеспечивать внешнюю синхронизацию.

Содержание

Функции-члены

создает объект promise
(public member function)
уничтожает объект promise
(public member function)
присваивает общее состояние
(public member function)
обменивает два объекта promise
(public member function)
Получение результата
возвращает future связанный с обещанным результатом
(public member function)
Установка результата
устанавливает результат в определенное значение
(public member function)
устанавливает результат в определенное значение с доставкой уведомления только при завершении потока
(public member function)
устанавливает результат для указания исключения
(public member function)
устанавливает результат для указания исключения с доставкой уведомления только при завершении потока
(public member function)

Функции, не являющиеся членами класса

специализирует алгоритм std::swap
(шаблон функции)

Вспомогательные классы

специализирует std::uses_allocator type trait
(специализация шаблона класса)

Пример

Этот пример показывает, как promise<int> может использоваться в качестве сигналов между потоками.

#include <chrono>
#include <future>
#include <iostream>
#include <numeric>
#include <thread>
#include <vector>
void accumulate(std::vector<int>::iterator first,
                std::vector<int>::iterator last,
                std::promise<int> accumulate_promise)
{
    int sum = std::accumulate(first, last, 0);
    accumulate_promise.set_value(sum); // Notify future
}
void do_work(std::promise<void> barrier)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    barrier.set_value();
}
int main()
{
    // Demonstrate using promise<int> to transmit a result between threads.
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6};
    std::promise<int> accumulate_promise;
    std::future<int> accumulate_future = accumulate_promise.get_future();
    std::thread work_thread(accumulate, numbers.begin(), numbers.end(),
                            std::move(accumulate_promise));
    // future::get() will wait until the future has a valid result and retrieves it.
    // Calling wait() before get() is not needed
    // accumulate_future.wait(); // wait for result
    std::cout << "result=" << accumulate_future.get() << '\n';
    work_thread.join(); // wait for thread completion
    // Demonstrate using promise<void> to signal state between threads.
    std::promise<void> barrier;
    std::future<void> barrier_future = barrier.get_future();
    std::thread new_work_thread(do_work, std::move(barrier));
    barrier_future.wait();
    new_work_thread.join();
}

Вывод:

result=21