当前位置: 首页 > 知识库问答 >
问题:

如何从Main C#确定线程何时处于死锁状态

淳于乐池
2023-03-14

我读过其他关于死锁检测和避免死锁工具的文章;我的主要线程是如何进入死锁状态的,我的主要问题是如何进入死锁状态。

我尝试使用ThreadState。WaitSleepJoin检测是否所有线程在Main中的较长一段时间都处于死锁状态,但这似乎不起作用;是否有任何实用程序方法可用于确定所有线程何时都处于死锁状态?

我试图在进餐哲学家中实现死锁场景,当所有的线程首先拿起右边或左边的筷子时,它们将永远等待另一只筷子,因此死锁发生;唯一的问题是,我无法找到所有这些线程何时进入进入等待状态。

这是我的跑步方法

public virtual void Run()
    {
        while (!stop)
        {
            Random random = new Random();
            try
            {
                outputList.Add("Thinking", identity);
                Thread.Sleep(random.Next(1, 100000000));

                outputList.Add("Hungry", identity);
                right.get();
                outputList.Add("Got Right", identity);

                Thread.Sleep(random.Next(1, 100000000));

                left.get();
                outputList.Add("Got Left", identity);
                outputList.Add("Eating", identity);

                Thread.Sleep(random.Next(1, 100000000));
                right.put();
                left.put();
            }
            catch (Exception e)
            { }
        }
    }

这主要是:

      public static List<DiningState> MainFunction(int numberPhilosophers)
      {
        Thread[] phil = new Thread[numberPhilosophers];
        ChopStick[] fork = new ChopStick[numberPhilosophers];
        DeadlockDiningPhilosopherController ph = null;

        for (int i = 0; i < numberPhilosophers; ++i)
        {
            fork[i] = new ChopStick(i);
        }

        Stopwatch time = Stopwatch.StartNew();

        for (int i = 0; i < numberPhilosophers; ++i)
        {
            ph = new DeadlockDiningPhilosopherController(i, fork[(i - 1 + numberPhilosophers) % numberPhilosophers], fork[i]);
            phil[i] = new Thread(new ThreadStart(ph.Run));
            phil[i].Start();
        }

        for (int i = 0; i < numberPhilosophers; i++)
        {
            if (phil[i].ThreadState != System.Threading.ThreadState.WaitSleepJoin)
            {
                i = i - 1;
                Thread.Sleep(10000);
            }
            else
            {
                continue;
            }
        }
        for (int i = 0; i < numberPhilosophers; i++)
        {
            if (phil[i].ThreadState == System.Threading.ThreadState.WaitSleepJoin)
            {
                phil[i].Abort();
            }
        }
        time.Stop();

        int timespan = (int)time.Elapsed.TotalSeconds;
        Console.WriteLine("Total Time: " + time.Elapsed.TotalMilliseconds + time.Elapsed.TotalSeconds);

        return outputList;
     }

如何用有效的解决方案替换WaitSleepJoin,以发现何时所有线程都处于死锁状态?

请帮助,任何建议都非常感谢!谢谢你!

共有1个答案

苏俊友
2023-03-14

如果线程处于死锁状态,我认为您无法从主thrad使其工作。我们唯一能做的就是使用锁、互斥、监视器等来避免死锁。

 类似资料:
  • 本文向大家介绍什么是线程死锁?如何避免死锁?相关面试题,主要包含被问及什么是线程死锁?如何避免死锁?时的应答技巧和注意事项,需要的朋友参考一下 认识线程死锁 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态

  • 各位。我正在为一个编程课做一个游戏,由两条蛇组成,它们朝相反的方向走在一条边界上。它们需要阻挡障碍物,我使用协调使它们不会相互对抗。这意味着第二个尝试访问细胞,需要等到第一个解锁细胞。我已经在这个网站上阅读了很多主题,但我仍然没有找到解决问题的方法。 现在我已经看到蛇在板上四处移动,并在障碍物中阻塞。下面是我的两大问题,我非常感谢您的帮助: 1-有特定的情况,例如,两条蛇走paralell,当他们

  • 问题内容: 我使用pthread_create创建几个子线程。一次,主线程要杀死所有子线程,否则将出现段故障。我应该使用哪个功能来完成此操作?我从谷歌搜索答案,并得到了类似pthread_kill的功能。但是我不知道应该向子线程发送哪个信号来杀死它们。我的运行环境是RHEL 5.4,编程语言是C。 问题答案: 可以使用来“取消”线程。但是,这通常不是最佳做法,尽管在SEGFAULT这样的极端情况下

  • 死锁描述了两个或多个线程永远被阻塞,等待彼此的情况。 当多个线程需要相同的锁但以不同的顺序获取它们时,会发生死锁。 Java多线程程序可能会遇到死锁条件,因为synchronized关键字会导致执行线程在等待与指定对象关联的锁定或监视器时阻塞。 这是一个例子。 例子 (Example) public class TestThread { public static Object Lock1

  • 主要内容:1 什么是Java线程死锁,2 Java线程死锁的例子1 什么是Java线程死锁 Java中的死锁是多线程的一部分。当线程正在等待由另一个线程获取的对象锁而第二个线程正在等待由第一个线程获取的对象锁时,可能会发生死锁。由于两个线程都在互相等待释放锁,因此这种情况称为死锁。 2 Java线程死锁的例子 输出结果为:

  • 问题内容: 从MDN for NodeList: 在某些情况下,NodeList是一个实时集合,这意味着DOM中的更改会反映在集合中。例如,Node.childNodes处于活动状态: 在其他情况下,NodeList是静态集合,这意味着DOM中的任何后续更改都不会影响集合的内容。document.querySelectorAll返回一个静态NodeList。 所以....有点烦!是否有任何关于哪些