Questo non è sicuro senza sincronizzazione. I thread di lettura possono essere nel mezzo di una lettura nello stesso momento in cui il thread di scrittura modifica l'elenco. E modificare la lista può significare riallocare la memoria sottostante.
L'RTL fornisce la classe TThreadList
per tale scenario. Ogni thread, sia di scrittura che di lettura, deve includere tutti gli accessi all'elenco nelle coppie LockList
e 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;
Se si utilizza un Delphi che supporta i generici v'è una versione generica, TThreadList<T>
.
fonte
2013-01-20 15:10:47
hmm. che non mi è mai venuto in mente, ho pensato che sarebbe stato sicuro se solo un thread lo scrivesse, ma non avrei mai pensato al problema che hai appena chiarito. quindi dovrei usare una tthreadlist allora. Grazie –
Userò la TIdThreadSafeList di indy, stavo solo cercando di saltare in qualche modo l'idea di bloccare e sbloccare. ci sono molte definizioni di thread nel server e il blocco di ognuna per un'operazione che probabilmente succederà troppe volte è semplicemente troppo lungo. –
Ciò potrebbe causare molti conflitti, poiché solo un thread può accedere all'elenco in qualsiasi momento. A seconda del tipo di dati memorizzati nell'elenco e se il writer non elimina gli elementi, un buon candidato per l'ottimizzazione è codificare il lettore per bloccare l'elenco solo per fare una copia dei contenuti, sbloccarlo e quindi eseguire il suo lavoro la copia. Puoi anche pensare in un approccio lettore multiplo-scrittore singolo in altri casi. – jachguate