TJson.JsonToObject <T>在多线程环境中抛出错误

det*_*ail 15 delphi rest multithreading json delphi-xe7

当使用TJson.JsonToObject在多线程环境中随机访问冲突发生.我在很长一段时间内都在寻找这个问题,我可以用下面的代码来隔离它

JSON类

type
   TParameter = class
   public
      FName     : string;
      FDataType : string;
      FValue    : string;
   end;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

它只是一个基于更复杂源代码的代码片段.只要我在单个线程中使用此代码,一切都可以正常运行.我想知道代码是否有任何问题.

Ste*_*nke 11

该方法TJSONUnMarshal.ObjectInstanceREST.JsonReflect.pas有一个严重的错误:

它在TRttiType实例上调用FreeAndNil.这应该永远不会做,因为所有TRtti***实例由TRttiContext管理.

删除FreeAndNil后,我再也无法重现访问冲突.

报告为:https://quality.embarcadero.com/browse/RSP-10035

PS我也认为https://quality.embarcadero.com/browse/RSP-9815会影响你的代码.

  • 感谢您调查此问题并报告+1 (2认同)