2017-10-02 26 views
1

私はBoost asioを使用してサーバーを作成していますが、問題が発生しています。 私のサーバーは、複数の接続されたクライアントからデータを受信し、特定のクライアントにもコマンドを送信できる必要があります。私はなどasync_readを呼び出すコールバックでasync_writeを呼び出すコールバックでasync_readを呼び出している接続クライアントごとに新しい接続セッションをインスタンス化しています。これを行うためにブーストasioで共有キューに送信するPollコマンド

...

私は「問題

私は送信するコマンドをクリックすることができるサーバー用のGUIを持っており、これらのコマンドは共有キューに置かれます。キューが共有されるので、各接続セッションは、接続されたクライアントに送信するコマンドがあるかどうかを調べるためにポーリングできます。

問題は、セッションで「コールバックする自分自身」のスキームで、パフォーマンスを損なうことなくキューに私のコマンドが存在するかどうかを確認する方法です(私の最初の解決策は、私は各X秒を確認することができるasync_write操作)?

答えて

0

プロのアクターベースのイベント処理は、キューのポーリングとは基本的に反対です。

通常、空きがなくなるまで待ち行列を作成し、書き込みループ(async_コールバックスタイルを使用)をスケジュールします。その例は、http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/example/cpp03/chat/chat_client.cppです(chat_message_queuewrite_in_progressを探してください)。

イベント(つまり「メッセージがキューに入れられました」)を挿入し、非同期コールチェーンがキューから排出されるようにします。 Why do I need strand per connection when using boost::asio?

- 各メッセージのアクションをキューイングを超える利点は、非同期呼び出しチェーンは暗黙の秩序/synchronization¹

が暗黙のストランドを¹ないということです

関連する問題