Multithreading delphitlist在多线程中的应用
在多线程应用程序中使用TList是否安全?该应用程序可由所有其他线程访问,但只有一个线程写入。情况是 每个线程都有一个唯一的TList,只有该线程会写入该TList,而其他线程只会访问该TList以从中获取数据Multithreading delphitlist在多线程中的应用,multithreading,delphi,tlist,Multithreading,Delphi,Tlist,在多线程应用程序中使用TList是否安全?该应用程序可由所有其他线程访问,但只有一个线程写入。情况是 每个线程都有一个唯一的TList,只有该线程会写入该TList,而其他线程只会访问该TList以从中获取数据 它安全吗?没有同步就不安全。在写入线程修改列表的同时,读取线程可以处于读取的中间。修改列表可能意味着重新分配底层内存 RTL为这种场景提供了TThreadList类。每个线程,包括写线程和读线程,都需要将对列表的所有访问权包装成LockList和UnlockList对 var Thr
它安全吗?没有同步就不安全。在写入线程修改列表的同时,读取线程可以处于读取的中间。修改列表可能意味着重新分配底层内存 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
正如其他人所述,TList
本身不是线程安全的。如果您担心使用TThreadList
(它在内部使用了一个关键部分)的开销,那么请看一看用一个或甚至一个Win32来包装您现有的TList
代码。hmm。我从来没有想到过,我想,如果只有一个线程写入它,它会有点安全,但从来没有想过你刚刚解决的问题。所以我应该使用TThread列表。ThanksI将使用indy的TIdThreadSafeList,我只是想以某种方式跳过锁定和解锁的想法。服务器中有很多ThreadSafeList,并且锁定每个ThreadSafeList以执行一个操作,这可能会发生太多次,这可能会导致很多争用,因为在任何给定时间只有一个线程可以访问该列表。根据列表中存储的数据类型,如果编写器没有删除项目,一个很好的优化候选者是对读卡器进行编码以锁定列表,只是为了制作内容的副本,解锁列表,然后在副本上执行它的工作。在其他情况下,您也可以采用多读单写的方法。是的,这是我认为应该做的,我锁定列表并将其分配给一个简单的tlist解锁线程安全列表,然后在正常的tlist上执行操作。如果写入线程破坏了项,而您复制了引用,那么这将不起作用