我有一个需要由多个线程处理的TObjectList。由于内部TObjectList继承自TList,TList将其内部实现为数组,我想知道:
只要我们访问不同的索引,从不同的线程访问数组是否安全?
例如,有一个名为myObjectList的TObjectList:
start = 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]);
答案 0 :(得分:12)
访问这样的成员是完全可以的 只要您不同时更改列表(例如添加,删除项目) 如果某些底层对象是相同的,那么如果它们不是线程安全的话,您可能会遇到问题。
答案 1 :(得分:0)
我会考虑使用TThreadList,它提供了Lock和Unlock方法,您可以使用它以线程安全的方式更改列表。如果您更喜欢使用TObjectList,您可以查看TThreadList的代码,并使用TCriticalSection自行锁定。