У меня есть многопоточная программа Delphi, создающая несколько экземпляров некоторых классов, и я хочу, чтобы у каждого экземпляра класса был свой экземпляр TMultiReadExclusiveWriteSynchronizer для использования в методах get и set определенных свойств.
например. Вот часть модуля, где я использую TMultiReadExclusiveWriteSynchronizer в одном классе:
interface
TSGThread=class(TThread)
private
fWaiting:boolean;
function getWaiting:boolean;
procedure setWaiting(value:boolean);
public
property waiting:boolean read getWaiting write setWaiting;
end;
implementation
var syncWaiting:TMultiReadExclusiveWriteSynchronizer;
function TSGThread.getWaiting:boolean;
begin
syncWaiting.BeginRead;
result:=fWaiting;
syncWaiting.EndRead;
end;
procedure TSGThread.setWaiting(value:boolean);
begin
syncWaiting.BeginWrite;
fWaiting:=value;
syncWaiting.EndWrite;
end;
initialization
syncWaiting:=TMultiReadExclusiveWriteSynchronizer.Create;
finalization
syncWaiting.Free;
end.
Проблема в том, что устройство создает один экземпляр TMultiReadExclusiveWriteSynchronizer, который затем используется несколькими экземплярами TSGThread.
Синхронизатор контролирует доступ только к приватному полю TSGThread.
Поток A может изменить поле в потоке B, используя открытое свойство, следовательно, необходим синхронизатор, но в каждом потоке должен быть отдельный синхронизатор, чтобы потокам не приходилось ждать друг друга, если они изменяют свои собственные свойства.
В справке Delphi говорится: «создать глобальный экземпляр TMultiReadExclusiveWriteSynchronizer», но обязательно ли для него всегда быть глобальным?
Если класс защищает доступ только к своим собственным свойствам, будет ли работать синхронизация с экземпляром TMultiReadExclusiveWriteSynchronizer в закрытом поле?