访问 TObjectList 线程的不同索引是不是安全?

Posted

技术标签:

【中文标题】访问 TObjectList 线程的不同索引是不是安全?【英文标题】:Is accessing to different indexes of a TObjectList thread safe?访问 TObjectList 线程的不同索引是否安全? 【发布时间】:2009-05-28 08:10:16 【问题描述】:

我有一个需要由多个线程处理的 TObjectList。由于内部 TObjectList 继承自 TList 并且 TList 将其内部实现为数组,我想知道:

只要我们访问不同的索引,从不同的线程访问数组是否是线程安全的?

例如,有一个名为 myObjectList 的 TObjectList:

开始 = 0; end = myObjectList.Count div 2;

线程1:

for i := 0 to end do
  Process(myObjectList[i]);

线程2:

for i := end + 1 to myObjectList.Count - 1 do
  Process(myObjectList[i]);

【问题讨论】:

【参考方案1】:

像这样访问成员是完全可以的。 只要您不同时更改列表(例如添加、删除项目)。 如果某些底层对象是相同的,那么如果它们不是线程安全的,那么您可能会遇到问题。

【讨论】:

【参考方案2】:

我会考虑使用 TThreadList,它提供了 Lock 和 Unlock 方法,您可以使用它以线程安全的方式更改列表。如果您更喜欢使用 TObjectList,您可以查看 TThreadList 的代码,并使用 TCriticalSection 自己进行锁定。

【讨论】:

我真的不需要修改列表,只是阅读它,所以我想避免锁定的负担。我只是想确认一下,只要您阅读列表就没有问题。 “只是阅读”总是线程安全的。只有当你开始在一个线程中更改内容而另一个线程尝试使用它们时,你才会遇到麻烦。

以上是关于访问 TObjectList 线程的不同索引是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

TList TObjectList的区别和使用

操作不同的数组(对象数组)索引时是不是需要同步

排序 TObjectList<T> 交换相等的值

教程-TObjectList.ClearTStringList.Clear方法对象有没有被释放

Delphi 调用 .Clear 对 TObjectList<T> 调用包含对象的析构函数

CUDA 线程、SMX、SP 和块,它们是如何工作的?