6

他のすべてのスレッドによってアクセスされるが、1つのスレッドだけがそれに書き込むマルチスレッドアプリケーションでTListを使用するのは安全ですか?シナリオは

他のスレッドがそこからデータをフェッチするためにそれにアクセスする間、そのスレッドだけが書き込む各スレッドへの一意のTList。

安全ですか?

4

2 に答える 2

11

それは同期なしでは安全ではありません。読み取りスレッドは、書き込みスレッドがリストを変更すると同時に、読み取りの途中にすることができます。また、リストを変更すると、基になるメモリを再割り当てすることを意味します。

RTLは、そのTThreadListようなシナリオのクラスを提供します。書き込みスレッドと読み取りスレッドの両方の各スレッドは、リストへのすべてのアクセスをペアでラップする必要がありLockListますUnlockList

var
  ThreadList: TThreadList;//declared in some shared location
....
//each thread accesses the list like this:
var
  List: TList;
....
List := ThreadList.LockList;
try
  .... do stuff with List
finally
  ThreadList.UnlockList;
end;

ジェネリックをサポートするDelphiを使用している場合は、ジェネリックバージョンがありTThreadList<T>ます。

于 2013-01-20T15:10:47.577 に答える
5

他の人が述べているようにTList、それ自体はスレッドセーフではありません。TThreadList(クリティカル セクションを内部で使用する) 使用のオーバーヘッドが心配な場合は、既存のTListコードを TMultiReadSingleWriteSynchronizer、または Win32 SRW lockでラップすることを検討してください。

于 2013-01-21T10:41:59.493 に答える