-
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()
在第一个线程注意到它意图关闭之前,你最终会得到两个线程。
您可能需要考虑使用两个变量 - 一个用于“是否意味着是一个清洁线程”。一个用于“实际上是否有清洁线程。”
另外,如果您使用带有 Wait / Pulse
的监视器,或 EventHandle
(例如 ManualResetEvent
),您可以让您的睡眠更多无效等待时间,可以更快地处理停止请求。
不隶属于 StackOverflow