【发布时间】:2013-01-20 15:08:50
【问题描述】:
在所有其他线程都可以访问但只有一个线程写入的多线程应用程序中使用 TList 是否安全。场景是
每个线程都有一个唯一的 TList,只有该线程会写入,而其他线程只会访问它以从中获取数据。
安全吗?
【问题讨论】:
标签: multithreading delphi tlist
在所有其他线程都可以访问但只有一个线程写入的多线程应用程序中使用 TList 是否安全。场景是
每个线程都有一个唯一的 TList,只有该线程会写入,而其他线程只会访问它以从中获取数据。
安全吗?
【问题讨论】:
标签: multithreading delphi tlist
没有同步是不安全的。读取线程可以在写入线程修改列表的同时处于读取的中间。修改列表可能意味着重新分配底层内存。
RTL 为这种情况提供了TThreadList 类。每个线程,包括写线程和读线程,都需要将所有对列表的访问封装在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>。
【讨论】:
正如其他人所说,TList 本身不是线程安全的。如果您担心使用TThreadList(在内部使用临界区)的开销,那么看看用TMultiReadSingleWriteSynchronizer 甚至是Win32 SRW lock 包装您现有的TList 代码。
【讨论】: