这个线程安全吗?

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)你可以让你的睡眠时间更加活跃,那么停止请求的速度会更快.

  • 我会说那些不编译的东西在技术上是线程安全的 - 它永远不会陷入僵局或遇到竞争条件:-) (12认同)
  • 这是否意味着我的汽车是空气安全的,因为它永远不会飞,从而不会遇到空中碰撞? (8认同)
  • 将第一个单词从"no"更改为"well"...我想我会说不编译的代码的线程安全性是未定义的.毕竟,代码无法在多个线程上安全运行. (4认同)