Identify the thread which holds the lock

后端 未结 6 1042
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-25 11:03

one of the threads in my application blocked at the following lock statement and resulted in a deadlock

void ExecuteCommand()
{
    lock(this._lockinstance)
         


        
6条回答
  •  悲&欢浪女
    2020-12-25 11:23

    Old posts are old.

    But i thought i might give a solution i find to be fairly useful for trying to track down dead locks and other locking problems.

    I use a disposable class for my lock - I like Monitor but any locking mechanism could be used.

    public class MonitorLock : IDisposable
    {
        public static MonitorLock CreateLock(object value)
        {
            return new MonitorLock(value);
        }
    
        private readonly object _l;
    
        protected MonitorLock(object l)
        {
            _l = l;
            
            Console.WriteLine("Lock {0} attempt by {1}", _l, Thread.CurrentThread.ManagedThreadId);
            
            Monitor.Enter(_l);
    
            Console.WriteLine("Lock {0} held by {1}" , _l, Thread.CurrentThread.ManagedThreadId);
        }
    
        public void Dispose()
        {
            Monitor.Exit(_l);
    
            Console.WriteLine("Lock {0} released by {1}", _l, Thread.CurrentThread.ManagedThreadId);
        }
    }
    

    I use a lock object with a name so I can be clear as to which lock I'm trying to aquire.

    public class LockObject
    {
        public string Name { get; set; }
    
        public LockObject(string name)
        {
            Name = name;
        }
    
        public override string ToString()
        {
            return Name;
        }
    }
    

    Finally create a lock object, and then in a using block hold the object.

    //create an object to lock on
    private readonly object _requestLock = new LockObject("_requestLock");
    
    using (MonitorLock.CreateLock(_requestLock))
    {
        //do some work
    }
    

    Output should be something along the lines of

    Lock _requestLock attempt by 92
    Lock _requestLock held by 92
    Lock _requestLock attempt by 19
    Lock _requestLock released by 92
    Lock _requestLock held by 19
    Lock _requestLock released by 19
    

    Hope that someone finds this useful :)

提交回复
热议问题