Как инициализируется критическая секция, связанная с каждым объектом?

Когда ты говоришь

lock (obj)
    ...

.NET использует критическую секцию в obj для синхронизации следующих операторов.

Как инициализируется этот критический раздел? (например, инициализируется ли он во время строительства или лениво?)


person user541686    schedule 22.12.2011    source источник
comment
Что заставляет вас думать, что в объекте есть критическая секция?   -  person John Saunders    schedule 23.12.2011
comment
возможный дубликат внутренней реализации Lock (Monitor) в .NET   -  person Jim Mischel    schedule 23.12.2011
comment
@JimMischel Это похоже, но имеет другую направленность, чем этот вопрос.   -  person Reed Copsey    schedule 23.12.2011


Ответы (2)


Каждый объект получает 4-байтовый «блок» памяти, выделенный ему (syncblk), который является индексом в SyncTableEntry. Когда объект создан, syncblk присваивается 0, что предотвращает любое дополнительное выделение памяти (кроме этого 4-байтового числа). При взятии блокировки этот syncblk устанавливается на соответствующую запись в таблице, что может привести к выделению. По сути, это ленивая инициализация.

Когда вы вызываете lock(object), это эффективно использует Monitor.Enter для объекта, что, в свою очередь, устанавливает запись соответствующим образом. Подробнее см. в этой статье MSDN о внутреннем устройстве памяти .NET.

person Reed Copsey    schedule 22.12.2011

Согласно документации Microsoft процесс выделяет память критической секции при объявлении переменной типа CRITICAL_SECTION.

person Dennis Traub    schedule 22.12.2011