c++ - 将 std::future 传递给 boost::thread 与 std::thread
问题描述
我似乎无法弄清楚为什么以下代码使用 std::thread 编译,而不是使用 boost::thread 编译,在 msvs 2015 上给出以下错误。
严重性代码描述项目文件行抑制状态错误 C2280 'std::future::future(const std::future &)':试图引用已删除的函数
#include <thread>
#include <iostream>
#include <assert.h>
#include <chrono>
#include <future>
#include <boost/thread/thread.hpp>
void threadFunction(std::future<void> futureObj)
{
std::cout << "Thread Start" << std::endl;
while (futureObj.wait_for(std::chrono::milliseconds(1)) == std::future_status::timeout)
{
std::cout << "Doing Some Work" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
std::cout << "Thread End" << std::endl;
}
int main()
{
// Create a std::promise object
std::promise<void> exitSignal;
//Fetch std::future object associated with promise
std::future<void> futureObj = exitSignal.get_future();
// Starting Thread & move the future object in lambda function by reference
std::thread th(&threadFunction, std::move(futureObj));
//boost::thread th(&threadFunction, std::move(futureObj));//this gives error
//Wait for 10 sec
std::this_thread::sleep_for(std::chrono::seconds(10));
std::cout << "Asking Thread to Stop" << std::endl;
//Set the value in promise
exitSignal.set_value();
//Wait for thread to join
th.join();
std::cout << "Exiting Main Function" << std::endl;
return 0;
}
解决方案
因为boost::thread
的(function, args)
构造函数被指定为
仿佛
thread(boost::bind(f,a1,a2,...))
并boost::bind
在调用底层函数时复制参数而不是移动它们(因为它必须允许多次调用)。
为什么会这样?可能是由于与移动前的 Boost.Thread 版本向后兼容。
std::thread
没有这样的限制,并指定参数被移动。
推荐阅读
- python - Pandas 数据框 sort_values 设置默认升序 = False
- bash - 如何在 Bash 中抑制这个 sed?
- ios - 在 iOS 上从内存数据流播放音频
- javascript - 对时间间隔进行排序并合并一半
- google-app-engine - App Engine 任务队列:中断和 20 分钟重新启动
- python - Scrapy跟随以前的链接
- javascript - 将正则表达式添加到 Vue.js 数据对象
- swift - DidUpdateLocation 不存储位置,userLoc 始终为零
- angular - Angular 5,TypeScript 可观察到的问题
- wordpress - 如何在我的 wordpress 博客主页上显示子文件夹中的帖子