在多线程环境中使用TJson.JsonToObject
时,会发生随机访问冲突。我正在寻找问题很长时间,我可以使用以下代码将其隔离
JSON类
type
TParameter = class
public
FName : string;
FDataType : string;
FValue : string;
end;
Testfunction:
procedure Test();
var
myTasks: array of ITask;
i : integer;
max : integer;
begin
max := 50;
SetLength(myTasks, max);
for i := 0 to max -1 do begin
myTasks[i] := TTask.Create(procedure ()
var
json : string;
p : TParameter;
begin
json := '{"name":"NameOfParam","dataType":"TypeOfParam","value":"ValueOfParam"}';
p := TJson.JsonToObject<TParameter>(json);
p.Free;
end);
myTasks[i].Start;
end;
TTask.WaitForAll(myTasks);
ShowMessage('all done!');
end;
它只是一个基于更复杂源代码的代码段。只要我在单个线程中使用此代码,一切都可以正常运行。我想知道代码是否有问题。
答案 0 :(得分:11)
TJSONUnMarshal.ObjectInstance
中的REST.JsonReflect.pas
方法存在严重错误:
它在TRttiType实例上调用FreeAndNil。这应该从不,因为所有TRtti ***实例都由TRttiContext管理。
删除FreeAndNil后,我再也无法重现访问冲突。
报告为:https://quality.embarcadero.com/browse/RSP-10035
P.S。我还认为https://quality.embarcadero.com/browse/RSP-9815会影响您的代码。