5

我尝试使用boost thread futures。因此,如图所示我们可以从打包的任务中获得共享的未来

所以我在linux上尝试了这样的功能:

template <class task_return_t>
void pool_item( boost::shared_ptr< boost::packaged_task<task_return_t> > pt)
{
    boost::shared_future<task_return_t> fi= pt->get_future(); // error
    //...

但我得到错误调用它:

../../src/cf-util/thread_pool.h: In member function ‘void thread_pool::pool_item(boost::shared_ptr<boost::packaged_task<R> >) [with task_return_t = void]’:
../../src/cf-util/thread_pool.h:64:3:   instantiated from ‘void thread_pool::post(boost::shared_ptr<boost::packaged_task<R> >) [with task_return_t = void]’
../../src/cf-server/server.cpp:39:27:   instantiated from here
../../src/cf-util/thread_pool.h:124:58: error: conversion from ‘boost::unique_future<void>’ to non-scalar type ‘boost::shared_future<void>’ requested

我之前没有从该任务中获得任何未来。所有源代码我调用的地方,我调用的线程池。在 Visual Studio 2010 下的 Windows 上,它可以完美地编译和运行。

我该怎么办?如何修复或解决此错误?

4

4 回答 4

4

unique_futureto的转换使用文档shared_future中的以下构造函数:

shared_future(unique_future<R> && other);

这使用右值引用来确保在源代码中清楚地表明您打算破坏“其他”的值。默认情况下,VC++2010 可能提供足够的右值引用支持来直接支持它,而您在 linux 上使用的编译器(可能是 gcc)需要一个额外的标志-std=gnu++0x来支持它。如果没有那个标志,boost 会退回到“移动仿真”,这可能(我没有检查过)需要你写:

boost::shared_future<task_return_t> fi = boost::move(pt->get_future());
于 2011-12-26T06:40:58.590 回答
1

杰弗里·亚斯金是正确的。该函数在带有 -std=gnu++0x 标志的 Linux 上使用 g++ (4.6.3) 编译,或者如果您想要严格的 ISO 编译,则使用 -std=c++0x 标志。这些 -std 标志现在已弃用,分别支持 gnu++11 和 c++11。(我刚刚对此发表了评论,但还没有足够的权限)

于 2012-05-03T17:49:28.473 回答
0

在 C++11 中,您应该调用 std::future::share() 从未来获取 shared_future。例如,

auto sf=std::async([]{/* something */}).share();
于 2012-04-29T15:23:27.997 回答
0

您是否可能忘记包含正确的标题?

如果没有,像下面这样的不同构造函数是否有效?

boost::shared_future<task_return_t> fi(pt->get_future());
于 2011-09-04T10:32:40.693 回答