2012-01-04 23 views
2

新しいLoggerコンポーネント(.NET 3.5、C#)を設計しています。ロックフリーキューを実装する(Loggerコンポーネント用)

ロックフリーの実装を使用したいと思います。

単一のスレッドのみがファイル/その他の記憶媒体に実際の出力を行いますが、ロギングイベントは(潜在的に)複数のスレッドから送信されます。

本質的に、すべての作者は、他のプロセス(LogFileWriter)によって取得されるように、それらのデータをいくつかのキューにエンキューする*です。

これはロックレスの方法で実現できますか?ネット上のこの特定の問題を直接参照することはできませんでした。

+4

と思われます。ほとんどのロギング・アクティビティーでは、片方のログの断続的な供給と、他方のロギング・ディスクの遅いディスクがあります。ロックされたカーネル管理のキューは、そのような機能にとって最も効率的です。あなたのアプリケーションでロックレスキューが望ましい特別な理由はありますか? –

+0

ほとんどのロガーは、たとえ使用できなくてもロックを使用しているかどうかはわかりません。私の要求は高性能であり、これはできるだけ早くロガーを呼び出すスレッドを解放することを意味します。このシナリオでは、ロックを取得することは無駄に思われます。 –

+1

私はHansに同意します。 http://logging.apache.org/log4net/は自家製システムよりも高速である可能性が高く、適切に動作するためには開発やデバッグに要する時間が少なくて済みます。 –

答えて

13

に見えるかもしれません、あなたは多くを持っていますより大きな問題。ロックは競合していないとき、私のシステムで約75ナノ秒かかる(2.0 GHz Core 2 Quad)。それが争われるとき、もちろん、それはやや長くかかるでしょう。しかし、ロックはEnqueueまたはDequeueへの呼び出しを保護しているだけなので、ログ書き込みの合計時間は75ナノ秒をはるかに超えることはありません。

ロックは問題ある場合 - あなたはあなたのスレッドがそのロックの後ろに並んで、アプリケーションに目立つスローダウンを引き起こして見つけた場合、である - ロックフリーキューを作成することを助けるために起こっている可能性は低いです多く。どうして?あなたが実際にログに多くのことを書いているなら、ロックフリーのブロックキューは非常に速くいっぱいになるので、I/Oサブシステムの速度に制限されます。

私は、単純なロックによって保護されているQueue<string>に200個のログエントリの順番で書き込みを行うマルチスレッドアプリケーションを持っています。私は重要なロックの競合に気づいたことは一度もなく、処理は少なくとも少し遅くならない。その75ナノ秒は他のすべてのことをするのにかかる時間までには矮小です。

+0

+1。 –

5

このロックフリーキューの実装は、キューがデキューされ、ロガーによって書き出されるアイテムをエンキューするために使用するデータ構造である場合に役立ちます。

http://www.boyet.com/Articles/LockfreeQueue.html

あなたは、この場合にはロックを使用することが遅すぎることが判明した場合あなたはまた、ネット4のConcurrentQueue

http://www.albahari.com/threading/part5.aspx#_Concurrent_Collections

http://geekswithblogs.net/BlackRabbitCoder/archive/2011/02/10/c.net-little-wonders-the-concurrent-collections-1-of-3.aspx

+0

ありがとう、私はそれをチェックします。 –

+0

私はそれらを認識していますが、それらを使用する機会がなかったので、これはすべての異なるシナリオ(例えば、複数の読者、複数のライター、単一の読者、複数のライターなど?決定的に答えられない。コンカレントコレクションの場合、それらが.netへの並列追加に伴って来るので、私は複数の読者/作家が意図していると思います。あなたの場合はおそらく、複数の作家、単一の読者が必要です。これは、キューにひどく課税するべきではありません。 – hatchet

+0

ハチェットが正しい軌道に乗っています。あなたはプロデューサ/コンシューマパターンを持っているので、ConcurrentQueueを持つBlockingCollectionがそのトリックを行います。 http://msdn.microsoft.com/en-us/library/dd267312.aspx。はい、さまざまなシナリオで動作します。賢明な分析のためには、 –

0

そこにはロックフリーのキューの実装がかなり異なっています。

私自身のhttp://hackcraft.github.com/Ariadne/は、簡単なアプローチを採用しており、必要に応じてオープンソースになっています。

ConcurrerntQueueもロックフリーですが、Ariadneには他の操作をサポートするメンバーがいくつかあります(アトミック操作としてコンテンツ全体の列挙をデキューするなど)。単一の消費者)。

関連する問題