3

ここでは、BartoszMilewskiによるいくつかのチュートリアルをフォローしています。これは非常に便利です。ただし、作成者はC ++11スレッド標準のju​​st ::thread実装(まだ持っていません)を使用しているため、チュートリアルの作成者が簡単に言うように、今のところブーストスレッドを使用することにしました。そうする。これは、シリーズの最初の3つのチュートリアルに当てはまるようですが、4番目のチュートリアルでいくつかの問題にぶつかりました。これが私のコードです:

#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:'boost :: promise :: promise':クラス'boost::promise'で宣言されたプライベートメンバーにアクセスできません

誰かが問題が何であるかを提案できますか?

前もって感謝します!

4

1 に答える 1

7

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

于 2012-01-10T11:28:06.030 に答える