5

ブースト スレッド フューチャーを使用しようとしています。ここに示すように、パッケージ化された taskから共有の futureを取得できます。

だから私は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

以前は、そのタスクから先物を取りませんでした。すべてのソース コード、呼び出し元の場所、呼び出し元のスレッド プール。また、Windows の Visual Studio 2010 では、コンパイルして完全に動作します。

何をすればよいでしょうか?このエラーを修正または回避するにはどうすればよいですか?

4

4 に答える 4

4

unique_futureからへの変換では、ドキュメントshared_futureで次のコンストラクターを使用します。

shared_future(unique_future<R> && other);

これは右辺値参照を使用して、'other' の値を破棄するつもりだったことがソース コードで明確になるようにします。Linux(おそらくgcc)で使用しているコンパイラは、それをサポートするような追加のフラグを必要としますが、VC++ 2010はデフォルトでそれを直接サポートするのに十分な右辺値参照サポートを提供する可能性があります-std=gnu++0x。そのフラグがないと、ブーストは「ムーブ エミュレーション」にフォールバックします。

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

ジェフリー・ヤスキンは正しいです。この関数は、Linuxでは-std = gnu ++0xフラグを使用してg++(4.6.3)でコンパイルします。厳密にISOコンパイルが必要な場合は、-std = c++0xフラグを使用してコンパイルします。これらの-stdフラグは廃止され、それぞれgnu++11とc++11になりました。(私はこれをコメントしたばかりですが、まだ十分な特権を持っていません)

于 2012-05-03T17:49:28.473 に答える
0

正しいヘッダーを含めるのを忘れた可能性はありますか?

そうでない場合、以下のような別のコンストラクターは機能しますか?

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

C++11 では、std::future::share() を呼び出して、future から shared_future を取得する必要があります。例えば、

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