2012-03-08 6 views
3

私は着信イベントを受信して​​ジョブキューに入れるepollを持っています。スレッドプールとジョブキューアーキテクチャ

イベントがジョブキューに入れられると、pthread条件信号がワーカースレッドを起動するために送信されます。

しかし、私はすべてのワーカースレッドがビジー状態で、Jobsがキューにスタックを保持するという問題を経験しました。これは深刻な問題です。ジョブが積み重なり、新しいイベントがしばらく来ないと、キュー内のジョブはワーカースレッドに渡されないからです。

スレッドが利用可能になるとすぐに、ジョブキューからジョブを自動的に取得できることを確認します(可能な場合)。

どうすればよいですか?私が考えることができるのは、キューオブザーバを追加し、間隔で条件付き信号を送信することだけです。

また、私はSTL Queueがスレッドセーフではないことを知っています。 STL QueueにアクセスするたびにMutex Lockをロックする必要がありますか?これは私の作業プロセスを遅くしませんか?

この問題を解決するためのあらゆる提案は素晴らしいでしょう。

+0

stlキューに関しては、異なるスレッドからアクセスまたは変更されている場合、キューオブジェクトへのアクセスをロックで確実に管理する必要があります。オーバーヘッドが重要かどうかは、ロックの競合の量によって決まります。これは、アクティブなスレッドの数と各ジョブの処理に費やした時間に関係します。 –

+0

まず、パフォーマンスについて心配する必要はありません。作業を優先する必要があります。それは非常に高速ではありません;それは役に立ちません;)次に、キューを保護するために使用できるcvで使用するmutexをすでに持っているはずです。私は本当にあなたがミューテックスなしでそれを行うことができるとは本当に疑問です。 –

+0

しかし、これにはすでに優れているライブラリがいくつかあります。たとえば、boost.threadpoolです。あなたが非常に正確な要件を持っていない限り、premadeものを使う方が良い考えです。最後に、小さすぎる仕事をしようとしないでください。あなたの仕事が本当に小さい場合、あなたは簿記の時間を失います。可能であれば、10回または100回のバッチで再編成してください。 –

答えて

1

プロデューサ - コンシューマキューでジョブをカウント/シグナリングする従来の方法は、セマフォを使用することです。プロデューサーは仕事をした後にそれを通知し、消費者はそれをポップする前にそれを待ちます。複数のアクセスからキューを保護するには、push/popの周りにmutexが必要です。

0

.NETのwork-stealing thread poolをご覧ください。はい、私はdouble-lock dequeを書いているので、グローバルキューをmutexロックする必要があります。フロント/バックの操作は並行して行うことができます。私もlock-free dequeを持っていますが、オーバーヘッドはクライアント側のアプリにとっては高すぎます。

関連する問題