2009-05-28 6 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

このようなメンバーへのアクセスは完全にOKです。
リストを同時に変更しない限り(アイテムの追加、削除など)、
基本オブジェクトの一部が同じ場合、スレッドセーフでないと問題が発生する可能性があります。

0

私はTThreadListの使用を検討しました。これはLockとUnlockメソッドを提供していますので、スレッドセーフな方法でリストを変更することができます。 TObjectListの使用を好む場合は、TThreadListのコードを見て、TCriticalSectionを使用して自分自身をロックします。

+0

本当にリストを修正する必要はありません。読み込みするだけでロックの負担を避けたいのです。私はちょうどあなたがちょうど問題がないリストを読んでいる限り、それを確認したかった。 –

+0

「読み込み中」は常にスレッドセーフです。別のスレッドがスレッドを使用しようとしている間に、あるスレッドで変更を開始するときにのみ問題が発生します。 –

関連する問題