2012-01-10 7 views
3

私はBartosz Milewski hereのチュートリアルに従っており、非常に便利です。 しかし、私がまだ持っていないC++ 11スレッディング標準のjust::thread実装を使用しているので、私はチュートリアルの作者がそのようにするのは簡単だと言っています。 。これはシリーズの最初の3つのチュートリアルの場合のようですが、私は第4の問題にいくつかの問題にぶつかりました。ここに私のコードは次のとおりです。C++ - Boost.Promise、Boost.Unique_FutureとMove Semantics

#include <iostream> 
#include <cassert> 
#include <boost\thread.hpp> 
#include <boost\thread\future.hpp> 

void thFun(boost::promise<std::string> & prms) 
{ 
    std::string str("Hi from future!"); 
    prms.set_value(str); 
} 

int main() 
{ 
    boost::promise<std::string> prms; 
    boost::unique_future<std::string> fut = prms.get_future(); 

    boost::thread th(&thFun, std::move(prms)); // error C2248: 'boost::promise<R>::promise' : cannot access private member declared in class 'boost::promise<R>' 

    std::cout << "Hi from main!"; 
    std::string str = fut.get(); 
    std::cout << str << std::endl; 
    th.join(); 

    return 0; 
} 

次の行は、私は理解していない問題を提起するようだ:

boost::thread th(&thFun, std::move(prms)); 

コンパイラは文句場​​所:

エラーC2248:「後押しを:: promise :: promise ':プライベートにアクセスできない メンバーは' boost :: promise 'クラスで宣言されました

誰でも問題の原因を示唆することはできますか?

ありがとうございます!

+0

Boost.Threadsは移動セマンティクスをサポートしているため、コンパイラはそれをサポートしていないか、C++ 11モードでコンパイルしていません(たとえば、GCCの '-std = C++ 0x')。 –

+0

私は 'std :: move()'を他の例で使用していましたが問題ありませんでしたので、それはそれだとは思いませんが、間違っている可能性があります。私は 'boost :: move()'も試みましたが、結果は同じでした。 –

答えて

7

boost::threadは、追加の引数を持つスレッド関数を処理するために使用されます。これらの引数はコピー可能である必要があります。約束をポインタまたは参照(たとえばboost::refなど)で渡すことはできますが、それはオブジェクトがスレッドより寿命を超えていることを必要とします。この例では問題ありませんが、切り離されたスレッド、またはスレッドを開始した関数よりも寿命が長いスレッドの場合は、スタック上にあるboost::promiseオブジェクトの使用が妨げられます。

+0

返事をありがとう、アンソニー。 just :: threadの実装はこれとどのように違うのですか? –

+0

just :: threadは 'bind'に依存しないので、すべての引数を移動できます。 –