1

我有一个 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]);
4

2 回答 2

12

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

于 2009-05-28T08:26:37.363 回答
0

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

于 2009-05-28T08:34:21.733 回答