Изучаю многопоточность в C++. Никак не могу понять, что такое std::promise, для чего он нужен и почему так называется? Объясните, пожалуйста. Нагуглить чего-то толкового не получилось.
Обещание (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 образует механизм межпоточного взаимодействия, который позволяет передать результат выполнения потока (или исключение, выброшенное в потоке) в вызывающий поток. Механизм одноразовый, то есть передать получится только результат. Для многократной передачи данных нужно использовать другие средства.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости