2009-08-27 14 views
0

私は複数のスレッドを持つクラスでlog4netを使用していますが、私は簡単な質問がありました。 log4net.ILogインターフェイスのプロパティとメソッドをチェックするときにreadlock/writelockを入力する必要がありますか?共有インターフェースとReaderWriterLockSlim

私は私が持っていると述べたクラスの先頭にlog4netの例から提案された方法を使用しています:

Private Shared ReadOnly log As log4net.ILog = log4net.LogManager.GetLogger(decType) 

とクラスがそれと対話する複数のスレッドを伴うため、私は私が使用ReaderWriterLockSlimインスタンスを持っています自分の変数と競合することがないようにしてください。

If Me.ReaderWriterLockSlim.TryEnterUpgradableReadLock(-1) Then 
    If log.IsWarnEnabled Then 
    If Me.ReaderWriterLockSlim.TryEnterWriteLock(-1) Then 
     log.Warn("Log Message Here") 
     Me.ReaderWriterLockSlim.ExitWriteLock() 
    End If 
    End If 
    Me.ReaderWriterLockSlim.ExitUpgradeableReadLock() 
End If 

それとも、私は単にこれを行うことができます:

If log.IsWarnEnabled Then log.Warn("Log Message Here") 

P.S.を要約するので、私はこのような何かをしないといけない安全なスレッドを練習してることを確認したい場合はい、それは荒い擬似コードですが、私は実際には 'ReaderWriterLockSlim'という名前のReaderWriterLockSlimのインスタンスを持っていません。

+0

編集スティーブンのおかげで、私は最近、多くのLinuxの作業に行ってきました。ああ、私は抵抗できないので、「sudoはスティーブンを砂にする」 –

答えて

3

あなたは基本的にlog4netスレッドセーフであるかどうかを知りたいですか? FAQから

はい、log4netのは、スレッドセーフです。

だから、あなたは、単にこれを行うことができます:

If log.IsWarnEnabled Then log.Warn("Log Message Here") 
+0

マルチスレッドクラス内で共有オブジェクトとして使用しても、スレッドセーフであることを確認したかったのです。私はウェブページからそれを読んだのですが、それを使用する必要があったので、私にとっては最悪の場合のように、私はまだ(スレッド)安全であることを確認したかったのです。 –

+0

"スレッドセーフ"(.NETクラス/メソッドに適用される)の定義は、 "複数のスレッドから同時に使用するのが安全"です。共有オブジェクトであることに関する部分は無関係です。 –

+0

「スレッドセーフ」と呼ばれるものがある場合、追加の同期コードなしで、マルチスレッドクラス内の共有オブジェクトに対して個々のメソッドを呼び出すことができます。もちろん、 'IsWarnEnabled'の戻り値が' If'と 'Then'の間で変化すると、あなたの例は望ましくないログメッセージを生成するかもしれません。 – dtb

1

をあなたの例では上記の、あなたはIsWarnEnabledの値を変更していないとして、書き込みロックを入力する必要はありません。また、無限のタイムアウトでTryEnterWriteLockを呼び出す必要はありません.ReadWriterLockSlim.EnterWriteLockを呼び出すこともできます。だから、log4netのは、スレッドセーフ(他の人が言及したように、それはある)でなかった場合でも、次のように記述する必要があります:ログの値を変更する場合

readerWriterLock.EnterReadLock(); 
try 
{ 
    if(log.IsWarnEnabled) 
    log.Warn("log message here"); 
} 
finally 
{ 
    readerWriterLock.ExitReadLock(); 
} 

あなたはその後、書き込みロックを入力します。 IsWarnEnabled。

+0

ポイントはパターンです。そのパターンに従うことで、再ファクタリングなしでタイムアウト値(-1以外)を簡単に実装できます。 –

+0

確かに、私はちょうどここに来て、コードをコピー&ペーストする人のためにそれをクリアしたいと思っていました:-) – zcrar70

+0

Nick! –

関連する問題