8

以下のようなワーカークラスがあります。

class Worker{
public:
  int Do(){
    int ret = 100;
    // do stuff
    return ret;
  }
}

これは、boost::threadおよびboost::bindで実行されることを目的としています。たとえば、次のようになります。

Worker worker;
boost::function<int()> th_func = boost::bind(&Worker::Do, &worker);
boost::thread th(th_func);
th.join();

私の質問は、Worker :: Doの戻り値を取得するにはどうすればよいですか?

前もって感謝します。

4

5 に答える 5

13

別のオプションは、promise/futuresを使用することです。

class Worker{
public:
  void Do( boost::promise<int> & p){
    int ret = 100;
    // do stuff
    p.set_value(ret);
  }
};
//Later...
boost::promise<int> p;
boost::thread t( boost::bind(&Worker::Do, &worker, boost::ref(p));
int retval = p.get_future().get(); //This will block until the promise is set.

また、c ++ 0xを使用できる場合は、std :: asyncを使用すると、上記のすべてがパッケージ化され、次のようになります。

std::future<int> f = std::async( std::bind(&Worker::Do, &worker) );
int retval = f.get(); //Will block until do returns an int.
于 2011-11-14T16:41:30.700 に答える
7

戻り値が得られないと思います。

代わりに、Workerのメンバーとして値を保存できます。

class Worker{
public:
  void Do(){
    int ret = 100;
    // do stuff
    m_ReturnValue = ret;
  }
  int m_ReturnValue;
}

そしてそれを次のように使用します:

Worker worker;
boost::function<void()> th_func = boost::bind(&Worker::Do, &worker);
boost::thread th(th_func);
th.join();
//do something with worker.m_ReturnValue
于 2009-11-11T06:27:36.663 に答える
3

さらに、boost :: bind()およびboost :: function()への冗長な呼び出しもあります。代わりに、次のことを行うことができます。

class Worker{
    public:
       void operator(){
          int ret = 100;
          // do stuff
          m_ReturnValue = ret;
       }
    int m_ReturnValue;
}

Worker worker;
boost::thread th(worker());//or boost::thread th(boost::ref(worker));

Threadのコンストラクターは、内部のbind()呼び出しの便利なラッパーであるため、これを行うことができます。引数付きのスレッドコンストラクタ

于 2009-11-11T22:35:55.883 に答える
1
class Worker{
public:
  int Do(){
  int ret = 100;
  // do stuff
  return ret;
  }
}

Worker worker;
boost::packaged_task<int> ptask(boost::bind(&Worker::Do, &worker));
boost::unique_future<int> future_int = ptask.get_future();
boost::thread th(boost::move(ptask));
th.join();
if (future_int.is_ready())
   int return_value = future_int.get();

「boost::future」のコンセプトをご覧ください。このリンクを参照してください。

于 2013-07-30T08:16:17.883 に答える
-2

もう1つのオプションは、Boost.Lambdaライブラリを使用することです。Worker次に、クラスを変更せずに次のようにコードを記述できます。

Worker worker;
int ret;
boost::thread th( boost::lambda::var( ret ) = worker.Do() );
th.join();

これは、呼び出す関数を変更できない場合に特に便利です。このように、戻り値はローカル変数にラップされますret

于 2010-11-22T16:23:54.983 に答える