1

我想学习如何使用 packaged_task 检索函数的返回值。

在下面的代码中,我创建了一个运行我的函数 DoTask 的线程。然后我将该函数绑定到 packaged_task 并让它等待,同时我将它绑定到 packaged_task myTask。我提取了 myTask 的未来对象。现在我取消阻止 DoTask (notify_one) 上的条件变量,让它运行完成。我在 myTask 的 future 上执行 get() 以检索 DoTask 中返回 bool 的值。

但是,DoTask 不是等待 DoTask 返回,而是输入执行“INVOKE a function object”的代码,并且 get() 永远不会被执行。

是什么让 DoTask 无法设置我期望的未来,而是调用一个函数对象?

#include "stdafx.h"
#include <future>
#include <memory>
#include <thread>
#include <condition_variable>
#include <mutex>

std::condition_variable notifyCondVar;
std::mutex mu;

bool DoTask() 
{
  {
    std::unique_lock< std::mutex > locker( mu );
    notifyCondVar.wait( locker );
  }
  return true;
}

int main()
{
  std::thread packageTaskThread( DoTask );
  std::packaged_task< bool() > myTask( std::bind( DoTask ) );
  std::future< bool > taskFuture = myTask.get_future();
  notifyCondVar.notify_one();
  bool okay = taskFuture.get();
  packageTaskThread.join();

  return 0;
}
4

1 回答 1

1

您有一个线程正在运行DoTask并且有一个 packaged_task 指示运行DoTask。您从未实际执行过任务,因此以下两件事是错误的:

  1. 线程永远不会终止;
  2. 任务的未来永远不会满足。

也许您打算从打包的任务中移动构造线程,而不是:

#include <future>
#include <memory>
#include <thread>
#include <condition_variable>
#include <mutex>

std::condition_variable notifyCondVar;
std::mutex mu;

bool DoTask() 
{
  std::unique_lock<std::mutex> locker(mu);
  notifyCondVar.wait(locker);

  return true;
}

int main()
{
  std::packaged_task<bool()> myTask([]() { return DoTask(); });
  std::future<bool> taskFuture = myTask.get_future();

  std::thread packageTaskThread(std::move(myTask));

  notifyCondVar.notify_one();
  bool okay = taskFuture.get();

  packageTaskThread.join();
}

std::packaged_task您可以在本文档中查看使用示例。

(顺便说一句,您的额外范围块DoTask完全是多余的。)

于 2016-07-15T13:11:32.233 回答