Изучаю многопоточность в 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
образует механизм межпоточного взаимодействия, который позволяет передать результат выполнения потока (или исключение, выброшенное в потоке) в вызывающий поток. Механизм одноразовый, то есть передать получится только результат. Для многократной передачи данных нужно использовать другие средства.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
В программе пишутся координаты и длина линиипочему-то не работает х6 y3 длина 3
Всем доброго времени сутокВозможно, дубликат, но пока действенной инфы(кроме либы SDL и std::cin) не увидел