我有一个类似下面的工人类:
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的返回值?
提前致谢。
答案 0 :(得分:13)
另一种选择是使用承诺/期货。
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.
答案 1 :(得分: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
答案 2 :(得分:2)
此外,还有一些对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()调用的便利包装器。 Thread Constructor with arguments
答案 3 :(得分: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”概念,参考此link
答案 4 :(得分:-2)
另一种选择是使用Boost.Lambda库。然后,您可以按如下方式编写代码,而无需更改Worker
类:
Worker worker;
int ret;
boost::thread th( boost::lambda::var( ret ) = worker.Do() );
th.join();
当您无法更改要调用的函数时,这尤其有用。像这样,返回值包含在局部变量ret
中。