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