为什么我的线程调用函数对象而不是将其返回值分配给packaged_task的未来对象
Why does my thread invoke a function object instead of assigning its return value to my packaged_task’s future object?
我想学习如何使用packaged_task检索函数的返回值。
在下面的代码中,我创建了一个运行我的函数 DoTask 的线程。然后,我将该函数绑定到packaged_task并让它等待,同时将其绑定到packaged_task myTask。我提取了myTask的未来对象。现在,我在 DoTask (notify_one) 上取消阻止条件变量,让它运行完成。我对myTask的未来做了一个get()来检索DoTask中返回布尔值的值。
但是,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;
}
你有一个线程运行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();
}
您可以在本文档中查看std::packaged_task
的使用示例。
(顺便说一句,您在DoTask
中的额外范围块是完全多余的。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 使用"std::unordereded_map"映射到"std::list"对象