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;
}