Как инициализируется критическая секция, связанная с каждым объектом? - PullRequest
4 голосов
/ 23 декабря 2011

Когда вы говорите

lock (obj)
    ...

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

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

Ответы [ 2 ]

4 голосов
/ 23 декабря 2011

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

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

0 голосов
/ 23 декабря 2011

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

...