2016-09-17 6 views
3

私はBoost.asioライブラリを勉強しようとしています。 これで、通信できるクライアントとサーバーを作成できます。ブーストにio_serviceが必要なのはなぜですか?

なぜio_serviceオブジェクトを定義する必要がありますか?ソケットが基礎となるOSとの登録/通信を行うために使用できる唯一のオブジェクトであれば、どうしてそれを定義しなければならないのでしょうか?ソケットが自動的にそれを推測することはできませんか?私はここで何が欠けていますか?

答えて

9

シングルトンが悪い理由を逆に発見していますか?それはあなたの答えです。

完了したので、が制御され、Asioのサービス間でいくつのリソースが共有されるかを決定します。

そのため、あなたは今

  • アプリケーションで使用するASIOあなたはへのリンクライブラリのいずれも(それほどありませんが存在しますスレッドごとのサービスとASIOを使用
  • それを使用していてもすることができます共有状態)またはサービスごとに多数のスレッド

等で

2

ブースト:: ASIO :: io_serviceは、二つの役割を働く、任意のASIO関連するアプリケーションの中央部分です。

  1. 関数オブジェクトのキューです。あなたも、このようにソフトウェアを関連する非ネットワークでそれを使用することができます。

    無効関数func1(){ //何かを } 無効関数func2(int型x)は{ //は他に使って何かをするのx }

    int main(){ boost :: asio :: io_service io; io.post(func1); 012.Post(boost :: bind(func2,123));; io.run(); }

順次二つの機能あなたが(io.run呼び出すとき)に実行されるコードのこのサンプル - 投稿中でないし。 io_serviceへの投稿は単なるenque操作です。 これがなぜ有用なのか不思議に思うかもしれません。答えは、この簡単な例では明らかにそうではありません。しかし、同じio_serviceインスタンスのメソッドrun()が2つ以上のスレッドによって同時に呼び出されると思う場合は、複数のスレッドが他のスレッドによって生成される作業項目のワーカーとして動作できるモデルになります。マルチスレッドを容易にする、非常に強力なアイデアです。

  1. これは選択ループです:ネットワークアプリケーションでは、ソケットを表す多数のファイルディスクリプタを処理する必要があります。 while(!done){ //これはpoll()、select()などのファイル記述子をチェックします。 /のようになります。 /各読み込み可能なファイル記述子に対して:いくつかのバッファへの読み込みと受信したバイトの処理 //書き込み可能なファイル記述子ごとに//その記述子の保留中のバイトを書き込みます。 }

だから、あなたのようなものを呼び出すたび:

boost::asio::async_read(my_asio_socket, my_buffer, boost::bind(my_callback,...)) 

本当に起こるのだろうが基本となる記述子は読みやすくするためにselect()のメカニズムを介してテストされるということです。記述子が読み込み可能になると、データはmy_bufferに格納され、バッファがいっぱいになるとbind(...)によって構築された関数オブジェクトがio_serviceの関数オブジェクトキューに挿入されます。したがって、my_io_service.run()を実行しているスレッドが起動し、このコールバックを実行します。

複数のスレッドは必須ではありません。最初の例のようにメインスレッドで作業することはできます。このようにアプリケーションを設計する場合、io_serviceが複数のスレッドへの負荷のディスパッチを容易にすることができます。

これが役に立ちます。

+0

は「選択」ブロックしていませんか?私は 'async_read'が' poll'の何らかの組み合わせを使うことを期待しています –

+0

選択がブロックされていません:['int select(int nfds、fd_set * readfds、fd_set * writefds、 fd_set * exceptfds、' ** struct timeval * timeout '' '' ');'](http://man7.org/linux/man-pages/man2/select.2.html)。また、kqueue、epoll、poll、IO Completion Ports、Selectなどは実装の詳細です。 – sehe

+0

前のコメントは正しくありません。選択と同様の機能は、いくつかのディスクリプタを読み書きできるようになるまで、または最大時間(実際にはタイマーを実装するために使用することができる)までブロックします。従来の選択ベースのアプリでは、何も残されていない場合にのみselectを呼び出します。しばらく時間が経過するまで、または何かが受信されるまでブロックすることは問題ありません。 asioの場合、async_readは単独でselectをトリガしません。これはio_service :: run(どのブロック)によって行われます。 async_readは、次のselect()の呼び出し時にチェックされる何らかの種類のディスクリプタを挿入するだけです。 – collier

関連する問題