4

私が書いているネットワーク ライブラリは、TCP ソケットを介してメッセージを送受信する必要があります。メッセージはいつでも送受信できます。つまり、全二重チャネルとして機能する必要があります。

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

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

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

4

2 に答える 2

4

はい、可能です。多重化された I/O を許可する API を使用する必要があります。C/C++ と Python では、select() とノンブロッキング I/O を使用できるため、ブロックする唯一のネットワーク呼び出しは select() です。また、poll() や epoll() など、同じことを実現する類似の API もいくつかありますが、効率と移植性はさまざまです。Java にはノンブロッキング I/O APIもあります。

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

于 2011-01-13T01:58:56.647 に答える
0

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

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

于 2011-01-13T09:25:02.200 に答える