Как вы находите владельца замка (Монитор)? - PullRequest
8 голосов
/ 27 февраля 2011

Есть ли способ узнать, какой поток в данный момент владеет блокировкой?В частности, я ищу некоторый код для распечатки потока, который предотвращает захват блокировки.Я хочу попытаться заблокировать заданное время ожидания, а затем сообщить, какой поток блокирует блокировку от взятия.

Ответы [ 2 ]

8 голосов
/ 27 февраля 2011

Нет. Просто напишите код:

private int lockOwner;
private object lockObject = new object();
...
void foo() {
    lock(lockObject) {
        lockOwner = Thread.CurrentThread.ManagedThreadId;
        // etc..
    }
}

Есть другой недокументированный способ получить владельца блокировки, он не гарантированно работает, но обычно работает. Когда у вас есть активная точка останова, используйте Debug + Windows + Memory + Memory1. В поле ввода адреса введите имя объекта блокировки («lockObject») и нажмите Enter. Адресное поле меняется на адрес объекта в памяти. Отредактируйте его и добавьте «-4» к адресу, нажмите Enter. Первые 4 байта в дампе дают вам ManagedThreadId в шестнадцатеричном формате. Это работает для 32-битного кода, если вы никогда не вызывали GetHashCode для объекта блокировки. Что, конечно, не стоит.

0 голосов
/ 27 февраля 2011

РЕДАКТИРОВАНИЕ:

C #:

Для C # вы можете получить ответ здесь:

С Hans Passant,

class Test {
    private object locker = new object();
    public void Run() {
        lock (locker) {  // <== breakpoint here
            Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
        }
    }
}
...