【问题标题】:Delphi: How to create a Thread Safe global TList?Delphi:如何创建一个线程安全的全局 TList?
【发布时间】:2011-12-07 00:34:14
【问题描述】:

如何创建一个线程安全的全局 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

【问题讨论】:

标签: multithreading delphi thread-safety


【解决方案1】:

使用 TThreadList。问题解决了。

【讨论】:

  • 这就是构建 TThreadList 的目的。 TThreadList 不是线程列表,它是一个可以安全地从多个线程同时使用的 TList。
  • 谢谢!!我很难它是一些储物柜.. 但是没有属性 .count ,如何计算?
  • 您无法访问列表内容的计数,而其他线程可能正在更新列表,从而更改计数。这意味着你刚刚获得的计数是没有意义的。相反,TThreadList 提供了一个“签出”模型——你只能通过锁定线程列表来获取受保护的列表对象。在您解锁之前,没有其他线程可以使用线程列表。请务必使用 try/finally 以确保您始终解锁您锁定的内容。
  • 不要写像threadlist.LockList.Count这样的代码。这是自找麻烦 - 很容易忘记您必须调用 threadlist.UnlockList 来释放锁,以便其他线程可以使用该列表。调用 threadlist.LockList 并将结果分配给一个变量,启动一个 try 块并在 try 块中使用 list 变量,并以调用 threadlist.UnlockList 的 finally 关闭
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多