2012-01-15 18 views
2

ブーストASIOを使用してマルチスレッドtcpサーバを作成していますか?私はチュートリアルを読んで、いくつかの例を見て、私の理解が正しいことを確認したいだけです。ブーストアシオ付きマルチスレッドサーバ

サーバーは、複数のクライアントからの接続要求を受け付けます。すべてのスレッドがio_service::run()を呼び出す

  • io_service::run()を呼び出す単一io_serviceを、スレッド・プール」サーバが使用する

    1. 私の理解では、次の通りです。

    2. io_service::run()への呼び出しは鎖の中になく、ergoコンプリートハンドラは同時に実行できます。
    3. 要求スレッドのいずれかが選択されて到着すると、その読出しハンドラは、スレッドのいずれかが要求を処理完了すると第二のスレッド
    4. にリードハンドラを起動、
    5. 別の要求が到着すると呼ぶことにします別のスレッドでもその要求の処理を終了strand
    6. の中から、async_writeを呼び出し、それはまた、ザ・がio_serviceに書き込み
    7. strand経由で連載されているストランド内から、async_writeを呼び出し、エルゴ彼らは、スレッドセーフです。
    8. 書き込み操作が完了すると、スレッドが正しい私の理解ですか?このコールはstrandにより保護されていないと、スレッドが要求

    を処理するために使用されますasync_read()

  • を呼び出しますかこのソリューションは競合状態に対して脆弱ですか?

  • +2

    これは現在書かれているように、本当に答えることのできない質問です。あなたの理解に間違いはありません。あなたは特定の問題を抱えていますか?もしそうなら、いくつかのコードを投稿できますか? –

    +1

    私はちょうどその前に進んで実装する前に私の憶測や理解が正しいことを確認したかったのです。あなたはおそらくそれをやったと思う、ありがとう。私は、オストでASIOの経験が限られていましたが、これは怒りの中で初めて使用する予定です。 – mark

    +0

    @markこのサーバーを書いていますか?私は、マルチスレッド非同期サーバーのいくつかの例を見てきましたが、それは私にとってはオーバーヘッドです。あなたはあなたを見せてもらえますか? – Alex

    答えて

    3

    サム・ミラーが言ったように、あなたの前提はかなり正しいです。

    しかし、あなたが見つけられなかった問題を指摘したいと思います。

    ストランドはasync_write(s)をシリアライズし、したがってスレッドセーフであることは間違いありません。 しかし、ここでは問題はありません。async_writeは、同じソケットで使用されていない場合はスレッドセーフです。同じソケットでasync_writeをインターリーブするべきではないので、ストランドはここでは役に立ちません。

    ストランドは、前のasync_writeが完了するのを待ってから次のものを呼び出すことはありません。ソケット上ですでに何も実行されていない場合にのみ、async_write構造体を作成する必要があります。

    +0

    ご返信ありがとうございます。これは、複数のスレッドから同じソケット上でasync_writeを呼び出すことを防御すれば、ストランドが不要であることを意味しますか? – mark

    +0

    実際には、ここでストランドを使用する必要がありますが、async_writeでは直接使用するのではなく、async_writesをインターリーブしないように実装する必要があります。あなたは私の質問のいずれかですべての答えを見つける必要がありますhttp://stackoverflow.com/questions/7754695/boost-asio-async-write-how-to-not-interleaving-async-write-calls – TheSquad

    +0

    もう一度感謝します - サムミラーソリューションは非常にエレガントに見える – mark

    関連する問題