1

packaged_task を使用して関数の戻り値を取得する方法を学びたいです。

以下のコードでは、関数 DoTask を実行するスレッドを作成します。次に、その関数を packaged_task にバインドし、packaged_task myTask にバインドするまで待機させます。myTask の future オブジェクトを抽出します。ここで、DoTask (notify_one) の条件変数のブロックを解除して、実行を完了させます。DoTask の return bool の値を取得するために、myTask の future に対して get() を実行します。

しかし、DoTask が戻るのを待つ代わりに、DoTask は「関数オブジェクトの呼び出し」を行うコードに入り、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。実際にタスクを実行したことがないため、次の 2 つの点が間違っています。

  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 に答える