2013-01-20 22 views
6

È sicuro utilizzare TList in un'applicazione multithread a cui si accede da tutti gli altri thread ma solo un thread scrive su di esso. lo scenario èDelphi TList in multithreading

Un TList univoco per ogni thread su cui solo quel thread scriverà mentre altri thread lo accedono per recuperare i dati da esso.

È sicuro?

risposta

10

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>.

+0

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 –

+0

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. –

+0

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

5

Come altri hanno affermato, TList da solo non è thread-safe. Se sei preoccupato per il sovraccarico dell'utilizzo di TThreadList (che utilizza internamente una sezione critica), dai un'occhiata al codice TList esistente con un TMultiReadSingleWriteSynchronizer o anche a un Win32 SRW lock.

Problemi correlati