Когда использовать std :: future и std :: prom с std :: thread - PullRequest
0 голосов
/ 26 мая 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...