3

その存続期間中のプロセスには、1つのメインスレッドと1から50の他のワーカースレッドがあります。メインスレッドが新しい接続を受け入れると、それをboost :: unordered_mapに保存し、「新しいconコンテナー」と呼びます。ワーカースレッドは、「新しいconコンテナ」で新しい接続を時々チェックします。同期の目的で、1つのboost::mutexがあります。メインスレッドが「新しいconコンテナ」に書き込むと、このミューテックスがロックされます。このコンテナをチェックしている間のワーカースレッドもミューテックスをロックします。

ワーカースレッドがミューテックスをロックせず、「新しいconコンテナー」からスレッドセーフに読み取る方法はありますか?ワーカースレッドはソケットに対してリアルタイム操作を実行するため、ミューテックスをロックするとパフォーマンスが向上します。

4

2 に答える 2

4

単一のライターと複数のリーダーがある場合は、shared_mutexの使用を検討してください。

クラスboost::shared_mutexは、マルチリーダー/シングルライターミューテックスの実装を提供します。

于 2012-07-04T08:08:18.663 に答える
0

ワーカースレッドによって「新しいconコンテナー」をポーリングする代わりに、条件変数を使用して、ワーカーの1つが実行できるようになるまでワーカーをブロックする必要があります。これにより、競合が減り、ロックのオーバーヘッドが減ります。

さらに、コンテナを分割することができます。コンテナを1つにする代わりに、より多くのコンテナを使用して、すべてのコンテナに固定されたスレッドの束を割り当てます。その後、メインスレッドはすべての新しい接続を別のコンテナにプッシュします。

Torstenよろしくお願いします

于 2012-07-04T08:15:50.113 に答える