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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top