Come posso implementare un wrapper di elenco thread-safe in Delphi?
-
08-07-2019 - |
Domanda
Ho un wrapper di elenco che mantiene due Tstringlist e un TClassList
Ho bisogno che questo sia thread-safe, in modo che:
- Non sono consentite scritture simultanee (è necessario immettere uno stato di attesa di qualche tipo)
- La lettura durante la scrittura (o viceversa) non è consentita (deve essere inserito uno stato di attesa di qualche tipo)
- Letture simultanee sono consentite
Qualche idea su come posso farlo? Il mio istinto mi dice che ha bisogno di qualcosa di più di una semplice sezione critica, forse un semaforo o "contatore di utilizzo", forse uno di questi in congiunzione con un CS.
Non sono proprio sicuro da dove cominciare: qualsiasi cosa, dall'approccio generale in inglese al psuedo-code, all'implementazione di delphi o al collegamento esterno, sarebbe molto apprezzata.
Soluzione
Dovresti dare un'occhiata alla classe TMultiReadExclusiveWriteSynchronizer dichiarata in sysutils.pas ...
Altri suggerimenti
Dai un'occhiata a questo tutorial. Threading the Delphi Way
Guarda il capitolo 11, ma è tutto roba buona.
Dovresti davvero guardare TThreadList.
I metodi .Add, .Remove, .Clear bloccano automaticamente l'elenco per te. Se necessario, puoi anche bloccare / sbloccare secondo necessità:
x.LockList;
try
//do whatever
finally
x.Unlocklist;
end;
TMultiReadExclusiveWriteSynchronizer è una grande idea, ma non so se abbiano mai risolto tutti i bug. Ha sempre avuto problemi sotto carico.