Я читал, что клонированные наборы TClientDataSet являются потокобезопасными, если клоны доступны только для чтения (без публикации записей или перезагрузки данных).
Delphi - Является ли TClientDataset потокобезопасным?
Но меня беспокоит сам метод CloneCursor; метод заканчивается вызовом метода SetNotifyCallback исходного набора данных, который передает метод обратного вызова своему IDSCursor, если FNotifyCallback имеет значение False:
procedure TCustomClientDataSet.SetNotifyCallback;
begin
if not FNotifyCallback then
begin
Check(FDSCursor.SetNotifyCallBack(IntPtr(Self), @TCustomClientDataSet.NotifyCallback));
FNotifyCallback := True;
end;
end;
В маловероятном случае двух наборов данных, A и B, в отдельных потоках, клонирующих набор данных C почти в одно и то же время (FNotifyCallback набора данных C False), при этом A немного опережает B. B начинает выполнение SetNotifyCallBack C после того, как A проверил FNotifyCallback, но до А установил для FNotifyCallBack значение True в методе, показанном выше.
В этом сценарии метод FDSCursor SetNotifyCallback набора данных C вызывается почти одновременно двумя разными потоками; метод, который записывает ссылку на переменную внутри IDSCursor (я полагаю, не удалось найти исходный код). По общему признанию, оба вызова запрашивают сохранение одной и той же ссылки, но, как следует из заголовка, является ли CloneCursor потокобезопасным?
Пожалуйста, примите мою благодарность заранее.
CloneCursor
является потокобезопасным или нет? - person Jerry Dodge   schedule 28.08.2015