¿Cómo puedo implementar un contenedor de listas seguro para subprocesos en Delphi?
-
08-07-2019 - |
Pregunta
Tengo un contenedor de listas que mantiene dos Tstringlists y una TClassList
Necesito que esto sea seguro para subprocesos, de modo que:
- No se permiten escrituras concurrentes (se debe ingresar un estado de espera de algún tipo)
- No se permite leer mientras se escribe (o viceversa) (se debe ingresar un estado de espera de algún tipo)
- Las lecturas concurrentes están permitidas
¿Alguna idea sobre cómo puedo hacer esto? Mi instinto me dice que necesita más que solo una sección crítica, tal vez un semáforo o "contador de uso", tal vez uno de estos en conjunción con un CS.
Simplemente no estoy muy seguro de por dónde empezar: cualquier cosa, desde un enfoque general en inglés hasta el código psuedo, la implementación de Delphi o un enlace externo, sería muy apreciada.
Solución
Debería echar un vistazo a la clase TMultiReadExclusiveWriteSynchronizer declarada en sysutils.pas ...
Otros consejos
Echa un vistazo a este tutorial. Enhebrar el camino de Delphi
Mira el Capítulo 11, pero todo es bueno.
Realmente deberías mirar TThreadList.
Los métodos .Add, .Remove, .Clear bloquean automáticamente la lista por usted. Si es necesario, también puede bloquear / desbloquear según sea necesario:
x.LockList;
try
//do whatever
finally
x.Unlocklist;
end;
TMultiReadExclusiveWriteSynchronizer es una gran idea, pero no sé si alguna vez solucionaron todos los errores. Siempre ha tenido problemas bajo carga.