Ash*_*son 4 .net c# multithreading locking thread-safety
这个线程安全吗?
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 15
好吧,它甚至都不会编译,因为你试图锁定一个值类型.
引入一个引用类型的单独锁定变量,例如
private static readonly object padlock = new object();
Run Code Online (Sandbox Code Playgroud)
除此之外:
如果StopBrowserCleaning()被称为虽然是清洁线程(虽然它睡觉),但随后StartBrowserCleaning()的是,它的意思是关闭第一个线程通知前再次呼吁,你会用两个线程结束.
您可能需要考虑使用两个变量 - 一个用于"是否意味着要清理线程",另一个用于"实际上是否有清理线程".
此外,如果你使用监视器Wait/Pulse,或者EventHandle(例如ManualResetEvent)你可以让你的睡眠时间更加活跃,那么停止请求的速度会更快.