2009-05-28 38 views
1

我有一个TObjectList需要由几个线程处理。由于内部TObjectList继承自TList,并且TList将其内部实现为一个数组,我不知道:正在访问TObjectList线程安全的不同索引吗?

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

例如,具有TObjectList称为myObjectList:

开始= 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]); 

回答

12

访问这样的成员是完全确定。
只要你没有在同一时间改变列表(例如添加,删除项目)。
如果某些底层对象相同,那么如果它们不是线程安全的,则可能会出现问题。

0

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

+0

我真的不需要修改列表,只是阅读它,所以我想避免锁定的负担。我只是想确认一下,只要你阅读清单就没有问题。 – 2009-05-28 08:47:02