boost-asio ネットワーク プログラミングの場合、応答を処理するための最適なアプローチは何ですか?
-
11-09-2019 - |
質問
私はネットワークプログラミング、特に非同期プロセスについては初心者です。boost-lib で新たに始める
imap サーバーにアクセスするためのクラスを実装しています。一般的にコマンドと応答を送信して受け取ることができます
応答はクラス内のデキューに入れられます。さらなる処理のために、単純に応答行をキューに入れます。
キューに入れられた応答を処理する最適な方法は何でしょうか?
- 新しいエントリがないかキューを(時間ベースで)チェックするための追加のスレッドはありますか?
- 新しいエントリがキューにプッシュされるたびに、何らかのコールバックが行われますか?
このコールバックを実装および統合するにはどうすればよいですか?
おそらく誰かがこれについての短い例を持っているでしょう。
ありがとう
解決
新しいエントリがキューにプッシュされるたびに、何らかのコールバックが行われますか?このコールバックを実装および統合するにはどうすればよいですか?
シングルスレッドの同期接続を使用していると思います。
次のようなことをしてください。
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 個の「キュー処理スレッド」がバックグラウンドで待機している可能性があります。
何かがキューに入れられるたびに、セマフォが信号を送信します。
シグナルはスリープ状態の「キュー処理」スレッドによって受信され、スレッドはデータがあることを認識してキューの処理を開始します。
スレッドがデータの処理を終了したら、キュー サイズをチェックして、何か他のものを取得する必要があるかどうかを確認し、そうでない場合はシグナルの待機に戻ります。