2

一般的なイベント処理 (I/O Demultiplexing) またはリアクター パターン モデルを設計する場合。使用する基本的なシステム コールは「select」または「poll」です。しかし、どちらのシステム コールも、FD の共通セットではスレッド セーフではありません。マルチスレッド環境では使用できません。

複数の I/O にまたがる複数のスレッドでイベントを処理するためのより良いアプローチは何でしょうか。

私が見ることができる1つの方法は、メインスレッドrecvのすべてのイベントであり、スレッドプールの共有キューにプッシュします。ただし、ワーカー スレッドが I/O 経由でデータを送信できないため、同期の問題が発生します。また、メモリ オーバーフローの欠点もあります。

考えられるすべての提案を歓迎します。前もって感謝します。

4

3 に答える 3

1

ほとんどのUnixは、マルチスレッド環境で使用できるselect/pollのよりスケーラブルな代替手段を提供します。

ただし、マルチスレッド環境で正しく設定するのは難しい場合があるため、boost.asioなどの既存の抽象化レイヤーを確認することをお勧めします。

一方、boost.asioは無視できないオーバーヘッドをもたらします-私はそれに関するいくつかの情報とepoll/kqueueの代替抽象化をhttp://nginetd.cmeerw.orgで収集しました

于 2012-08-23T07:27:21.497 に答える
0

1 つの方法は、1 つの入力スレッド、1 つの出力スレッド、複数のワーカー スレッド、および 2 つのブロッキング キューを使用することです。

入力スレッドは入力メッセージを解析し、それらをキュー 1 に配置します。ワーカー スレッドはすべてキュー 1 で待機し、メッセージを処理して出力をキュー 2 に配置します。出力スレッドはキュー 2 で待機し、そこからの出力をシリアル化します。

InputThread:
    Loop:
        M = ReadNextMessage
        Q1.push(M)

AddOutput(O):
    Q2.push(O)

WorkerThread:
    Loop:
        M = Q1.pop
        ProcessMessage(M) using AddOutput as needed

OutputThread:
    Loop:
        O = Q2.pop
        WriteOutput(O)

ただし、 select がスレッドセーフではないという意味がわかりませんか? すべてのシステムコールは技術的にスレッドセーフです

非常に古いですが、それでも非常に興味深いのは、Kegel という人物による「The CY10K problem」という記事です。

http://www.kegel.com/c10k.html

Linux で「multi io」プログラムを構築するさまざまな方法と、それぞれの長所と短所について説明します。

于 2012-08-23T03:50:05.110 に答える
0

"Producer - Consumer problem"を確認してください。これは、スレッドセーフな問題の非常に良い出発点です。複数のプロデューサーと複数のコンシューマーに拡張することもできます。

于 2012-08-23T04:41:36.423 に答える