将std::future传递给boost::thread与std::thread



我似乎不明白为什么以下代码使用std::thread编译,但没有boost::thread,在msvs2015上给出了以下错误。

严重性代码描述项目文件行禁止显示状态错误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没有这样的限制,并且指定参数被移动。

最新更新