他のすべてのスレッドによってアクセスされるが、1つのスレッドだけがそれに書き込むマルチスレッドアプリケーションでTListを使用するのは安全ですか?シナリオは
他のスレッドがそこからデータをフェッチするためにそれにアクセスする間、そのスレッドだけが書き込む各スレッドへの一意のTList。
安全ですか?
他のすべてのスレッドによってアクセスされるが、1つのスレッドだけがそれに書き込むマルチスレッドアプリケーションでTListを使用するのは安全ですか?シナリオは
他のスレッドがそこからデータをフェッチするためにそれにアクセスする間、そのスレッドだけが書き込む各スレッドへの一意のTList。
安全ですか?
それは同期なしでは安全ではありません。読み取りスレッドは、書き込みスレッドがリストを変更すると同時に、読み取りの途中にすることができます。また、リストを変更すると、基になるメモリを再割り当てすることを意味します。
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>
ます。
他の人が述べているようにTList
、それ自体はスレッドセーフではありません。TThreadList
(クリティカル セクションを内部で使用する) 使用のオーバーヘッドが心配な場合は、既存のTList
コードを TMultiReadSingleWriteSynchronizer
、または Win32 SRW lockでラップすることを検討してください。