这个线程安全吗?

时间:2009-09-14 05:58:23

标签: c# .net multithreading thread-safety locking

这个线程安全吗?

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;
    }
}

1 个答案:

答案 0 :(得分:15)

好吧,它甚至都不会编译,因为你试图锁定一个值类型。

引入一个引用类型的单独锁定变量,例如

private static readonly object padlock = new object();

除此之外:

如果 一个清理线程(当它正在休眠时)调用StopBrowserCleaning(),但在第一个线程注意到它意味着关闭之前再次调用StartBrowserCleaning()你最终会得到两个线程。

您可能需要考虑使用两个变量 - 一个用于“有意为清洁线程”,另一个用于“实际上是否有清理线程。”

此外,如果你使用Wait/PulseEventHandle(例如ManualResetEvent)的监视器,你可以让你的睡眠时间更加活跃,停止的请求将是处理得更快。