boost::asio::io_service
から戻り値を取得するにはどうすればよいですか?関数の書き換えを伴わないバインドや単純な構文を使用することは可能ですか?Boost :: ASIO:io_serviceから戻り値を取得するにはどうすればよいですか?
以下は最小の例です。私はGetSum()
の値を取得しようとしています:
#include <iostream>
#include <boost/asio.hpp>
#include <functional>
using namespace std;
void SayHello()
{
std::cout<<"Hello!"<<std::endl;
}
template <typename T>
T GetSum(T a, T b)
{
std::cout<<"Adding " << a << " and " << b << std::endl;
return a+b;
}
int main(int argc, char *argv[])
{
boost::asio::io_service ioservice;
ioservice.post(&SayHello);
ioservice.post(std::bind(&GetSum<double>,1,2));
ioservice.run();
return 0;
}
なぜですか?私はスレッドプールを用意しているので、ユーザが自分の関数の戻り値を取得することを可能にするためのオプションを考えています。 。
私のソリューション:
int main(int argc, char *argv[])
{
boost::asio::io_service ioservice;
ioservice.post(&SayHello);
double sum;
ioservice.post([&sum]()
{
sum = GetSum(1,2);
});
ioservice.run();
std::cout<< sum <<std::endl; //is 3
return 0;
}
しかし、私はまだ、バインド、または何かを持つシンプルな何かがあります願っています。
あなたが – teivaz
@teivazが右についてサウンズ[ 'のstd :: future'](http://en.cppreference.com/w/cpp/thread/future)のいくつかの種類を必要とするようだが、私思考未来は 'std :: thread'に対して明示的に行われます。これはスレッドライブラリの一部です。 –
私はあなたのソリューションに加えて、操作が終了したときにio_serviceの内部で設定されている何らかの種類の 'ManualResetEvent'(またはmutex + cv)も取得すると思います。これにより、サブミッターは操作の結果を待つことができます( 'ioservice.run()'と同じように、キューに入れられたすべての操作が完了するまで待つだけでなく) 'std/boost :: future'を返します。 – Matthias247