Multithreading Delphi:如何创建线程安全的全局TList?

Multithreading Delphi:如何创建线程安全的全局TList?,multithreading,delphi,thread-safety,Multithreading,Delphi,Thread Safety,如何创建线程安全的全局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.FormCreat

如何创建线程安全的全局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.
我有两个线程,它们可以写入全局列表,但正如我所知,它不是线程安全的

那么如何使它安全呢


Delphi 2010,Indy 10,Win7

使用TThread列表。问题已解决。

相关:有关如何使用TThreadList的示例,请参阅。这就是构建TThreadList的目的。TThreadList不是线程列表,它是一个可以同时从多个线程安全使用的TList。谢谢!!我觉得这是个储物柜。。但是没有property.count,如何计数?当其他线程可能正在更新列表、更改计数时,您无法访问列表内容的计数。这意味着你刚才得到的计数是没有意义的。相反,TThreadList提供了一个“签出”模型——您只能通过锁定threadlist来获得受保护的列表对象。在解锁线程列表之前,其他线程不能使用它。请确保使用try/finally确保始终解锁锁定的内容。不要编写类似threadlist.LockList.Count的代码。这是自找麻烦-很容易忘记,您必须调用threadlist.UnlockList来释放锁,以便其他线程可以使用该列表。调用threadlist.LockList并将结果分配给一个变量,启动一个try块并在try块中使用list变量,最后以一个finally结束,该函数调用threadlist.UnlockList