Delphi:如何创建Thread Safe全局TList?

waz*_*123 8 delphi multithreading thread-safety

如何创建Thread Safe全局TList?

unit Unit1;
interface
uses
    ...;
type
  TForm1 = class(TForm)
  procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;
  global_TList: TList; // Not thread safe?

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
// something
end;

end.
Run Code Online (Sandbox Code Playgroud)

我有两个线程,可以写入global_TList,但据我所知,它不是线程安全的.

那么如何让它安全?

Delphi 2010,Indy 10,Win7

dth*_*rpe 19

使用TThreadList.问题解决了.

  • 不要编写类似threadlist.LockList.Count的代码.这就是要求麻烦 - 很容易忘记你必须调用threadlist.UnlockList来释放锁,以便其他线程可以使用该列表.调用threadlist.LockList并将结果赋值给一个变量,启动一个try块并使用try块中的list变量,然后关闭一个finally调用threadlist.UnlockList (5认同)
  • 您无法访问列表内容的计数,而其他线程可能正在更新列表,从而更改计数.这意味着你刚刚获得的计数数字毫无意义.相反,TThreadList提供了"检出"模型 - 您只能通过锁定线程列表来获取受保护的列表对象.在解锁之前,没有其他线程可以使用线程列表.务必使用try/finally确保您始终解锁锁定的内容. (2认同)