Итак, когда мне нужно вернуть значение из потока без OOP, основные параметры - это передать параметр функции по ссылке и использовать механизм обещания будущего.
#include <iostream>
#include <thread>
#include <future>
void dbl(std::promise<int>&& pr, int x)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // (1)simulating some work
pr.set_value(x*x);
std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // (2)continuing doing some work
}
void dbl1(int& x)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // simulating some work
x *= x;
}
int main()
{
std::promise<int> pr;
auto fut = pr.get_future();
std::thread t(dbl, std::move(pr), 5);
int d = fut.get(); //we are waiting for the result to be ready
std::cout<<d<<std::endl;
std::thread t1(dbl1, std::ref(d));
t1.join(); //and here we are waiting for the result to be ready
std::cout<<d<<std::endl;
t.join(); //to avoid program abortion in the end
}
Итак, как я вижу, если результат, который мне нужен, будет последним или единственным, что будет делать поток, мне действительно не нужно promise-future
, поскольку простая передача ссылки будет полностью такой же , хотя мне нужно быть более осторожным, чтобы не изменить значение в основном или другом потоке.
Итак, когда в dbl
после получения значения x
мне нужно сделать что-то еще, я могу извлечь выгоду из promise-future
, так как я уже могу передать вычисленное значение основного потока, но для dbl1
promise-future
будет просто дополнительными накладными расходами (при условии, что безопасность переданного значения потока не является проблемой), и передача по ссылке будет лучшим решением. Я что-то упускаю?