boost-asio ネットワーク プログラミングの場合、応答を処理するための最適なアプローチは何ですか?

StackOverflow https://stackoverflow.com/questions/763429

質問

私はネットワークプログラミング、特に非同期プロセスについては初心者です。boost-lib で新たに始める

imap サーバーにアクセスするためのクラスを実装しています。一般的にコマンドと応答を送信して受け取ることができます

応答はクラス内のデキューに入れられます。さらなる処理のために、単純に応答行をキューに入れます。

キューに入れられた応答を処理する最適な方法は何でしょうか?

  1. 新しいエントリがないかキューを(時間ベースで)チェックするための追加のスレッドはありますか?
  2. 新しいエントリがキューにプッシュされるたびに、何らかのコールバックが行われますか?
    このコールバックを実装および統合するにはどうすればよいですか?

おそらく誰かがこれについての短い例を持っているでしょう。

ありがとう

役に立ちましたか?

解決

新しいエントリがキューにプッシュされるたびに、何らかのコールバックが行われますか?このコールバックを実装および統合するにはどうすればよいですか?

シングルスレッドの同期接続を使用していると思います。

次のようなことをしてください。

class worker {

    deque<message> messages;
    bool is_writing_;

    push_message(message msg) {
        messages.push_back(msg);
        notify();
    }

    void notify()
    {
        if(!is_writing_) {
            is_writing_=true;
            init();
        }
    } 

    void init()
    {
        if(messages.empty()) { is_writing_=false; return; }
        messamge msg=messages.pop();
        convert_to_vector(v);
        async_write(socket,buffer(v),
            boost::bind(&worker::complete,this,placehoders::error));
    }
    void complete(error_code const &e)
    {
        if(!e) {
            init();
        }
        else { cleanup(); }
    }

};

注記!!!

これはシングルスレッド実装です。他のスレッドから通知したい場合は、電話してはいけません some_worker->push_message(msg), 、iosrvice を使用する必要があります。

service.post(boost::bind(&worker::push_message,some_worker,msg));

そして push_message ioservice を実行するのと同じスレッドから呼び出されます。

他のヒント

キュー プロセッサを実装する可能な 1 つの方法は、シグナリング セマフォを使用することです。

たとえば pthread 条件タイプ (説明) POSIX 準拠のプラットフォームを使用している場合。

N 個の「キュー処理スレッド」がバックグラウンドで待機している可能性があります。

  1. 何かがキューに入れられるたびに、セマフォが信号を送信します。

    • シグナルはスリープ状態の「キュー処理」スレッドによって受信され、スレッドはデータがあることを認識してキューの処理を開始します。

    • スレッドがデータの処理を終了したら、キュー サイズをチェックして、何か他のものを取得する必要があるかどうかを確認し、そうでない場合はシグナルの待機に戻ります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top