【问题标题】:Why cannot I acquire exclusive lock?为什么我不能获得排他锁?
【发布时间】:2009-04-13 20:04:37
【问题描述】:

以下程序打印:

Entered 3
Entered 4
Wait for Exited messages
Exited 3
Exited 4

意味着它不能获取资源的排他锁。为什么?

public class Worker
    {
        public void DoIt(object resource)
        {
            Monitor.Enter(resource);
            Console.WriteLine("Entered " + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(3000);
            Monitor.Exit(resource);
            Console.WriteLine("Exited " + Thread.CurrentThread.ManagedThreadId);
        }
    }

    class Program
    {
        struct Resource
        {
            public int A;
            public int B;
        }

        static void Main(string[] args)
        {
            Resource resource;
            resource.A = 0;
            resource.B = 1;

            var a = new Worker();
            var b = new Worker();

            var t1 = new Thread(() => a.DoIt(resource));
            var t2 = new Thread(() => b.DoIt(resource));

            t1.Start();
            t2.Start();

            Console.WriteLine("Wait for Exited messages");
            Console.ReadLine();
        }
    }

【问题讨论】:

    标签: c# multithreading locking


    【解决方案1】:

    您的 Resource 是一个结构。它在传递给DoIt 时被装箱,因此每次调用DoIt 都会锁定一个不同的对象。将Resource 更改为一个类。

    【讨论】:

      猜你喜欢
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多