私は着信イベントを受信してジョブキューに入れるepollを持っています。スレッドプールとジョブキューアーキテクチャ
イベントがジョブキューに入れられると、pthread条件信号がワーカースレッドを起動するために送信されます。
しかし、私はすべてのワーカースレッドがビジー状態で、Jobsがキューにスタックを保持するという問題を経験しました。これは深刻な問題です。ジョブが積み重なり、新しいイベントがしばらく来ないと、キュー内のジョブはワーカースレッドに渡されないからです。
スレッドが利用可能になるとすぐに、ジョブキューからジョブを自動的に取得できることを確認します(可能な場合)。
どうすればよいですか?私が考えることができるのは、キューオブザーバを追加し、間隔で条件付き信号を送信することだけです。
また、私はSTL Queueがスレッドセーフではないことを知っています。 STL QueueにアクセスするたびにMutex Lockをロックする必要がありますか?これは私の作業プロセスを遅くしませんか?
この問題を解決するためのあらゆる提案は素晴らしいでしょう。
stlキューに関しては、異なるスレッドからアクセスまたは変更されている場合、キューオブジェクトへのアクセスをロックで確実に管理する必要があります。オーバーヘッドが重要かどうかは、ロックの競合の量によって決まります。これは、アクティブなスレッドの数と各ジョブの処理に費やした時間に関係します。 –
まず、パフォーマンスについて心配する必要はありません。作業を優先する必要があります。それは非常に高速ではありません;それは役に立ちません;)次に、キューを保護するために使用できるcvで使用するmutexをすでに持っているはずです。私は本当にあなたがミューテックスなしでそれを行うことができるとは本当に疑問です。 –
しかし、これにはすでに優れているライブラリがいくつかあります。たとえば、boost.threadpoolです。あなたが非常に正確な要件を持っていない限り、premadeものを使う方が良い考えです。最後に、小さすぎる仕事をしようとしないでください。あなたの仕事が本当に小さい場合、あなたは簿記の時間を失います。可能であれば、10回または100回のバッチで再編成してください。 –