Multithreading 明显的死锁-如何适当地修复此问题

Multithreading 明显的死锁-如何适当地修复此问题,multithreading,Multithreading,在所有线程中,始终以相同的顺序输入锁。另请参见,即功能B需要: class Program { static void Main(string[] args) { Thread thread1 = new Thread((ThreadStart)DLockSample.FunctionA); Thread therad2 = new Thread((ThreadStart)DLockSample.Functi

在所有线程中,始终以相同的顺序输入锁。另请参见,即功能B需要:

class Program
    {
        static void Main(string[] args)
        {
            Thread thread1 = new Thread((ThreadStart)DLockSample.FunctionA);
            Thread therad2 = new Thread((ThreadStart)DLockSample.FunctionB);
            thread1.Start();
            therad2.Start();
        }
    }

    public class DLockSample
    {
static object object1 = new object();
        static object object2 = new object();

        public static void FunctionA()
        {
            lock (object1)
            {
                Thread.Sleep(1000);
                lock (object2)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine("heart beat - object2");
                }
            }
        }
        public static void FunctionB()
        {
            lock (object2)
            {

                lock (object1)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine("heart beat - object1");
                }
            }
        }    }

这是一个很难解决的问题。以下是一些提示:

  • 始终以相同的顺序锁定对象
  • 如果无法以相同的顺序锁定,请使用对象的字段来保留顺序(例如,如果A.Id>B.Id,则始终在B之前锁定A)

喜欢A.Id>B.Id的想法。您确实需要确保用于比较的值不能/不会在任何一个线程中更改,或者您可能仍然会发现第二个线程以不同的顺序锁定…代码块旨在模拟死锁场景,我们应该能够在其中提出一些合适的解决方案。如果您对上面的代码块不满意,那么您可以编写一个模拟死锁的示例吗?还有一个提议的解决方案……谢谢你的问题是“我该如何解决这个问题”。这就是答案。如果你的问题不同,请更新它,这样即使那些没有心灵感应能力的人也可以阅读这个问题。我同意。但代码块是为了模拟我们应该能够提出一些合适的解决方案的场景,这显然是故意的。这不是很有趣,只需交换FunctionB中的锁即可。如果你想要一个教育性的答案,一定要使用[家庭作业]标签。
public static void FunctionB()
        {
            lock (object1)
            {

                lock (object2)
    ...