2008-11-19 20 views
6

que tienen una envoltura lista que mantiene dos Tstringlists y un TClassList¿Cómo puedo implementar una envoltura de lista segura para subprocesos en Delphi?

necesito que esto sea seguro para subprocesos, tal que:

  • escrituras concurrentes no se les permite (estado de espera de algún tipo debe introducirse)
  • de lectura, mientras que no se permite la escritura (o viceversa) (estado de espera de algún tipo debe ser introducido)
  • Lecturas simultáneas son permitidos

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

No estoy muy seguro de por dónde empezar, cualquier cosa, desde un enfoque general en inglés hasta código psuedo, hasta la implementación de delphi o un enlace externo sería muy apreciado.

Respuesta

12

Usted debe echar un vistazo a la clase TMultiReadExclusiveWriteSynchronizer declarada en sysutils.pas ...

+1

Probablemente el nombre de clase más largo en el RTL :) – Serguzest

+0

podrían haberlo llamado fácilmente TMREWS – Steve

+5

Podrían haberlo llamado fácilmente TGreenIdea y transmitir tanta información como lo haría TMREWS. No temas nombres largos de identificadores. –

5

Tener un vistazo a este tutorial. Threading the Delphi Way

Mire el Capítulo 11, pero todo es bueno.

+0

Awesome Link. ¡Podría haber usado esto cuando estaba haciendo más en Delphi hace unos años! – JamesSugrue

+0

+1 por ese excelente enlace! –

2

Realmente debería 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 subsanadas todos los bichos. Siempre ha tenido problemas bajo carga.

+1

Eso no es lo que el OP necesita, ya que LockList() bloquea la lista de acceso exclusivo; por lo tanto, el acceso de lectura paralelo es imposible. – mghie

+2

Estaba completamente inconsciente de que TThreadList incluso existía hasta ahora. Había estado usando objetos TStringList con todo tipo de secciones críticas en mi código. ¡Esto hará la vida mucho más simple! – Mick

Cuestiones relacionadas