std::promise в C++

175
09 мая 2019, 16:10

Изучаю многопоточность в C++. Никак не могу понять, что такое std::promise, для чего он нужен и почему так называется? Объясните, пожалуйста. Нагуглить чего-то толкового не получилось.

Answer 1

Обещание (promise) - это ровно 1/2 механизма promise-future. Несмотря на то, что обещания и фьючерсы существуют всегда только парой и отдельно друг от друга использоваться не могут, первая часть этой пары особой известностью не пользуется. Если про фьючерс любая книжка по STL подробно рассказывает, то про обещание упоминает в лучшем случае мельком (а чаще вообще не упоминает).

Объясняется это просто - работа непосредственно с потоком и обещанием полностью закрыта высокоуровневой оберткой async, и фьючерсы всегда описывают именно в контексте использования функции async. В этом есть смысл, потому что иметь дело непосредственно с обещанием программисту приходится только в том редком случае, когда его не устраивает стандартный async, и он вынужден писать его аналог вручную.

Вот так выглядит простейший случай использования фьючерса с async:

#include <string>
#include <iostream>
#include <future>
using namespace std;
int main() {
  auto ThreadFunc = []() -> const char* { return "S novym godom!"; };  // Функция потока
  // Создать поток и получить связанный с ним фьючерс
  auto f = async(ThreadFunc);
  // Ожидать завершения потока и получит результат из фьючерса
  string s = f.get();
  cout << s;
  return 0;
}

А теперь сделаем то же самое без async, через базовые средства поток-обещание:

#include <string>
#include <iostream>
#include <future>
using namespace std;
int main() {
  promise<const char*> p;  // Создать обещание...
  future<const char*> f = p.get_future();  // ...и получить связанный с ним фьючерс
  auto ThreadFunc = [&p] () { p.set_value("S novym godom!"); };  // Функция потока
  // Запустить поток
  thread t(ThreadFunc);
  // Ожидать завершения потока и получит результат из фьючерса
  string s = f.get();
  cout << s;
  return 0;
}

Подводя итог: связанная пара promise-future образует механизм межпоточного взаимодействия, который позволяет передать результат выполнения потока (или исключение, выброшенное в потоке) в вызывающий поток. Механизм одноразовый, то есть передать получится только результат. Для многократной передачи данных нужно использовать другие средства.

READ ALSO
Странно работает функция C++

Странно работает функция C++

В программе пишутся координаты и длина линиипочему-то не работает х6 y3 длина 3

167
C++. Keyboard Input. Отлов нажатия

C++. Keyboard Input. Отлов нажатия

Всем доброго времени сутокВозможно, дубликат, но пока действенной инфы(кроме либы SDL и std::cin) не увидел

146