マルチスレッドプログラミングについて学ぶことはたくさんあるようですが、それはやや威圧的です。私の現在のニーズにメソッド全体をスレッドセーフにする最も簡単な方法は?
、私はちょうどそれが終了する前に再び別のスレッドから呼び出されるメソッドから保護したい、と私の質問は:
これは作るための適切な(安全な)方法ですメソッドはスレッドセーフですか?
class Foo
{
bool doingWork;
void DoWork()
{
if (doingWork) // <- sophistocated thread-safety
return; // <-
doingWork = true;
try
{
[do work here]
}
finally
{
doingWork = false;
}
}
}
それが十分でない場合は、これを実現する最も簡単な方法は何ですか?
EDIT:シナリオについての詳細情報:
がfooのインスタンスが1つしかない
- Elapsed System.Timers.Timerのイベントです。
通常Foo.DoWork()が呼び出され の次の時間の前に長い年月を終えるが、私はそれは、長い を実行し、終了する前に再び呼び出されることにスリムなチャンスをコードすることになるでしょう。
Foo.DoWorkは()にThreadPoolのスレッドから呼び出されます
(私もこの質問は、言語に依存しないタグを付けることができれば、必ずできるほど賢くないので、私はそうではありません。悟りを開いた読者は、その該当する場合に行うこと自由に感じています。)
Foo型のオブジェクトは、各スレッドに対してインスタンス化されていますか、複数のスレッドで共有されていますか? – NotMe
複数のスレッドがありますか? – sll
リエントラントをサポートしたり、コードを設計したりしないようにしてください。それが起こったときにただ救済することは、正しい解決策ではないようです。しかし、あなたの編集は、糸の安全性が実際には再突入ではなく問題であることを明確にしています。 –