Поле может быть присвоено или классу или экземпляру класса. Полями по умолчанию переменные экземпляра. При помощи static
поле становится переменной класса, таким образом существует один и только один clock
. При создании изменений в одном месте это видимо везде. Экземпляр varables изменяется друг независимо от друга.
Во-первых: ваш код из EndWrite находится в TSimpleRWSync, который является облегченной реализацией IReadWriteSync, тогда как TMultiReadExclusiveWriteSynchronizer намного сложнее.
Во-вторых: вызов LeaveCriticalSection (FLock) в EndWrite выполняет не снимайте блокировку, если все еще есть открытые вызовы EnterCriticalSection (FLock) (например, в BeginRead).
Это означает, что ваш пример кода вполне допустим и должен работать должным образом, если вы используете экземпляр TSimpleRWSync или Экземпляр TMultiReadExclusiveWriteSynchronizer.
У меня нет Delphi 2009, но я полагаю, что не было никаких изменений в способе работы TMultiReadExclusiveWriteSynchronizer. Я думаю, что это правильная структура для вашего сценария с одним замечанием: «BeginWrite» - это функция, возвращающая логическое значение. Убедитесь, что вы проверили результат перед выполнением операций записи.
Кроме того, в Delphi 2006 класс TMultiReadExclusiveWriteSynchronizer содержит множество комментариев разработчика, а также некоторый код отладки. Обязательно ознакомьтесь с реализацией перед ее использованием.
См. Также: Работа с TMultiReadExclusiveWriteSynchronizer на EDN
Благодаря ответам Уве Раабе и Тихауана:
TMultiReadExclusiveWriteSynchronizer отлично работает с такими вложенными блокирующими структурами. EndWrite не освобождает блокировку чтения повторно, поэтому можно легко преобразовать блокировку чтения в блокировку записи на определенный период времени, а затем вернуться к блокировке чтения без вмешательства других авторов.