複数のプロデューサー、単一のコンシューマーモデルを持つアプリケーションを作成しています(複数のスレッドが単一のファイルライタースレッドにメッセージを送信します)。
各プロデューサースレッドには2つのキューが含まれ、1つは書き込み用、もう1つはコンシューマー用のキューです。コンシューマースレッドのすべてのループは、各プロデューサーを反復処理し、そのプロデューサーのミューテックスをロックし、キューを交換し、ロックを解除して、プロデューサーが使用しなくなったキューから書き込みます。
コンシューマースレッドのループでは、すべてのプロデューサースレッドを処理した後、指定された時間スリープします。私がすぐに気付いたのは、プロデューサーがキューに何かを書き込んで戻るまでの平均時間が、1つのプロデューサースレッドから2に移動したときに劇的に(5倍)増加したことです。スレッドが追加されると、この平均時間は底に達するまで減少します。アウト-10人のプロデューサーと15人のプロデューサーの所要時間に大きな違いはありません。これはおそらく、処理するプロデューサーが多いほど、プロデューサースレッドのミューテックスの競合が少なくなるためです。
残念ながら、プロデューサーが5人未満の場合は、アプリケーションでかなり一般的なシナリオです。プロデューサーの数に関係なく、妥当なパフォーマンスが得られるように、スリープ時間を最適化したいと思います。スリープ時間を長くすると、プロデューサー数が少ない場合はパフォーマンスが向上しますが、プロデューサー数が多い場合はパフォーマンスが低下することに気付きました。
他の誰かがこれに遭遇しましたか?もしそうなら、あなたの解決策は何でしたか?スレッドの数でスリープ時間をスケーリングしようとしましたが、マシン固有であり、かなり試行錯誤のようです。