为什么我的线程调用函数对象而不是将它的 return 值分配给我的 packaged_task 的 future 对象?
Why does my thread invoke a function object instead of assigning its return value to my packaged_task’s future object?
我想了解如何使用 packaged_task 检索函数的 return 值。
在下面的代码中,我创建了一个线程来运行我的函数 DoTask。然后我将该函数绑定到 packaged_task 并让它等待,同时我将它绑定到 packaged_task myTask。我提取 myTask 的未来对象。现在我取消阻止 DoTask (notify_one) 上的条件变量,让它 运行 完成。我对 myTask 的未来执行 get() 以检索 DoTask 中 return bool 的值。
但 DoTask 并没有等待 DoTask return,而是输入执行“INVOKE 函数对象”的代码,并且 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;
}
你有一个线程运行宁DoTask
,和一个packaged_task指示运行DoTask
.您从未真正执行过该任务,因此以下两点是错误的:
- 线程永远不会终止;
- 任务的未来永远不会被满足。
也许您打算从打包的任务中移动构建线程,而不是:
#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();
}
您可以在 this documentation 中查看 std::packaged_task
的用法示例。
(顺便说一句,您在 DoTask
中的额外范围块完全是多余的。)
我想了解如何使用 packaged_task 检索函数的 return 值。
在下面的代码中,我创建了一个线程来运行我的函数 DoTask。然后我将该函数绑定到 packaged_task 并让它等待,同时我将它绑定到 packaged_task myTask。我提取 myTask 的未来对象。现在我取消阻止 DoTask (notify_one) 上的条件变量,让它 运行 完成。我对 myTask 的未来执行 get() 以检索 DoTask 中 return bool 的值。
但 DoTask 并没有等待 DoTask return,而是输入执行“INVOKE 函数对象”的代码,并且 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;
}
你有一个线程运行宁DoTask
,和一个packaged_task指示运行DoTask
.您从未真正执行过该任务,因此以下两点是错误的:
- 线程永远不会终止;
- 任务的未来永远不会被满足。
也许您打算从打包的任务中移动构建线程,而不是:
#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();
}
您可以在 this documentation 中查看 std::packaged_task
的用法示例。
(顺便说一句,您在 DoTask
中的额外范围块完全是多余的。)