在一个多线程应用程序中,如果只有一个线程写入TList,其他所有线程都可以访问它,那么使用TList是否安全?
每个线程都拥有一个唯一的TList,只有该线程才会向其中写入数据,而其他线程将仅访问它以获取数据。
这样做是安全的吗?
在一个多线程应用程序中,如果只有一个线程写入TList,其他所有线程都可以访问它,那么使用TList是否安全?
每个线程都拥有一个唯一的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
或者Win32SRW锁来封装现有的TList
代码。