6

在所有其他线程访问但只有一个线程写入它的多线程应用程序中使用 TList 是否安全。情况是

每个线程都有一个唯一的 TList,只有该线程会写入,而其他线程只会访问它以从中获取数据。

安全吗?

4

2 回答 2

11

没有同步是不安全的。读取线程可以在写入线程修改列表的同时处于读取的中间。修改列表可能意味着重新分配底层内存。

RTLTThreadList为这种场景提供了类。每个线程,包括写线程和读线程,都需要成对包装对列表的所有LockList访问UnlockList

var
  ThreadList: TThreadList;//declared in some shared location
....
//each thread accesses the list like this:
var
  List: TList;
....
List := ThreadList.LockList;
try
  .... do stuff with List
finally
  ThreadList.UnlockList;
end;

如果您使用的是支持泛型的 Delphi,则有一个泛型版本,TThreadList<T>.

于 2013-01-20T15:10:47.577 回答
5

正如其他人所说,TList它本身不是线程安全的。如果您担心使用的开销TThreadList(它在内部使用临界区),那么看看用一个,甚至是一个 Win32 SRW 锁TList来包装您现有的代码 。TMultiReadSingleWriteSynchronizer

于 2013-01-21T10:41:59.493 回答