このスレッドは安全ですか?
-
07-07-2019 - |
質問
このスレッドは安全ですか?
private static bool close_thread_running = false;
public static void StartBrowserCleaning()
{
lock (close_thread_running)
{
if (close_thread_running)
return;
close_thread_running = true;
}
Thread thread = new Thread(new ThreadStart(delegate()
{
while (true)
{
lock (close_thread_running)
{
if (!close_thread_running)
break;
}
CleanBrowsers();
Thread.Sleep(5000);
}
}));
thread.Start();
}
public static void StopBrowserCleaning()
{
lock (close_thread_running)
{
close_thread_running = false;
}
}
解決
さて、値型をロックしようとしているため、コンパイルすらできません。
参照型の個別のロック変数を導入します。例:
private static readonly object padlock = new object();
それ以外は:
StopBrowserCleaning()
がクリーニングスレッドが存在する間に(スリープ中に)呼び出され、その後 StartBrowserCleaning()
が再度呼び出される場合最初のスレッドがシャットダウンするつもりであることに気付く前に、2つのスレッドになります。
2つの変数を考慮することをお勧めします-「クリーニングスレッドがあることを意味します」もう1つは「実際にクリーニングスレッドがあります」
また、 Wait / Pulse
または EventHandle
(たとえば、 ManualResetEvent
)でモニターを使用する場合は、より睡眠をとることができます。停止のリクエストがより迅速に処理されるリアクティブ待機時間。
所属していません StackOverflow