2011-01-13 9 views
3

私が書いているネットワークライブラリは、TCPソケットを通してメッセージを送受信する必要があります。メッセージはいつでも送信または受信できます。つまり、全二重チャネルとして動作する必要があります。シングルスレッドでTCP上で全二重チャネルを実装する方法は?

2つのスレッドを使用してこのようなシナリオを実装することができました。メインスレッドはsend()を呼び出し、専用のスレッドは主にrecv()呼び出しでブロックしました。

私の質問です:単一のスレッドで同じシナリオを実装することは可能ですか?私。いくつかのコールバック関数を登録することによって?

補足として、このシナリオはC++、Java、Pythonで実装する必要があります。

答えて

4

はい、可能です。多重化されたI/Oを可能にするAPIを使用する必要があります。 C/C++とPythonではselect()とnon-blocking I/Oを使うことができるので、ブロックするネットワーク呼び出しはselect()だけです。またpoll()とepoll()と、さまざまな程度の効率性と可搬性を備えた、同じことを実現する他の同様のAPIがいくつかあります。 Javaにはnon-blocking I/O APIsもあります。

別の可能性は、I/Oトランザクションを開始するようにOSに指示する非同期I/Oを使用し、操作を完了したときに(あるメカニズムによって)通知します。私はネットワークプログラミングのそのスタイルに精通していないので、詳細を述べようとはしません。

0

一般に、ライブラリは、アプリケーションのメインループ/イベントループにインターフェイスを提供することでこれを行います。

たとえば、ほとんどのシングルスレッドネットワーク使用アプリケーションでは、select()poll()などでブロックするメインループが存在します。あなたのライブラリは、アプリケーションがそのselect()/poll()呼び出しに含めるべきファイル記述子と、そのファイル記述子が読み込み可能なときにアプリケーションが呼び出すべきコールバック関数を返します。

関連する問題