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

8

How to create a Thread Safe global 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.

我有两个线程,它们可以写入 global_TList ,但是我知道这样做不安全。

那么如何保证它的安全性呢?

使用 Delphi 2010、Indy 10 和 Win7


相关:https://dev59.com/YkXRa4cB1Zd3GeqPu9AJ - Warren P
请参考 Delphi 帮助,了解如何使用 TThreadList。 - LU RD
1个回答

19

使用 TThreadList。问题解决。


1
这就是TThreadList的设计目的。TThreadList不是线程列表,它是一个可以在多个线程同时安全使用的TList。 - dthorpe
谢谢!我以为这是某个锁定器.. 但是没有属性.count,如何计数? - jmp
2
当其他线程可能正在更新列表并更改计数时,您无法访问列表内容的计数。这意味着您刚获取的计数数字是没有意义的。相反,TThreadList提供了一种“签出”模型 - 您只能通过锁定threadlist来获取受保护的列表对象。在您解锁之前,没有其他线程可以使用threadlist。请确保使用try / finally以确保始终解锁已锁定的内容。 - dthorpe
5
不要编写像threadlist.LockList.Count这样的代码,这会引发问题——很容易忘记必须调用threadlist.UnlockList以释放锁定,以便其他线程可以使用列表。调用threadlist.LockList并将结果分配给一个变量,在try块中使用列表变量,并在finally中关闭并调用threadlist.UnlockList。 - dthorpe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接