访问 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 线程的不同索引是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章
教程-TObjectList.ClearTStringList.Clear方法对象有没有被释放