Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading delphitlist在多线程中的应用_Multithreading_Delphi_Tlist - Fatal编程技术网

Multithreading delphitlist在多线程中的应用

Multithreading delphitlist在多线程中的应用,multithreading,delphi,tlist,Multithreading,Delphi,Tlist,在多线程应用程序中使用TList是否安全?该应用程序可由所有其他线程访问,但只有一个线程写入。情况是 每个线程都有一个唯一的TList,只有该线程会写入该TList,而其他线程只会访问该TList以从中获取数据 它安全吗?没有同步就不安全。在写入线程修改列表的同时,读取线程可以处于读取的中间。修改列表可能意味着重新分配底层内存 RTL为这种场景提供了TThreadList类。每个线程,包括写线程和读线程,都需要将对列表的所有访问权包装成LockList和UnlockList对 var Thr

在多线程应用程序中使用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

正如其他人所述,
TList
本身不是线程安全的。如果您担心使用
TThreadList
(它在内部使用了一个关键部分)的开销,那么请看一看用一个或甚至一个Win32来包装您现有的
TList
代码。

hmm。我从来没有想到过,我想,如果只有一个线程写入它,它会有点安全,但从来没有想过你刚刚解决的问题。所以我应该使用TThread列表。ThanksI将使用indy的TIdThreadSafeList,我只是想以某种方式跳过锁定和解锁的想法。服务器中有很多ThreadSafeList,并且锁定每个ThreadSafeList以执行一个操作,这可能会发生太多次,这可能会导致很多争用,因为在任何给定时间只有一个线程可以访问该列表。根据列表中存储的数据类型,如果编写器没有删除项目,一个很好的优化候选者是对读卡器进行编码以锁定列表,只是为了制作内容的副本,解锁列表,然后在副本上执行它的工作。在其他情况下,您也可以采用多读单写的方法。是的,这是我认为应该做的,我锁定列表并将其分配给一个简单的tlist解锁线程安全列表,然后在正常的tlist上执行操作。如果写入线程破坏了项,而您复制了引用,那么这将不起作用