2010-10-20 11 views
13

Necesito crear una lista segura de subprocesos para agregar elementos a un índice lucene.Enlazar lista de seguridad (lista) en .net

¿Es seguro el siguiente subproceso?

public sealed class IndexQueue 
{ 
    static readonly IndexQueue instance = new IndexQueue(); 
    private List<string> items = new List<string>(); 

    private IndexQueue() { } 

    public static IndexQueue Instance { 
     get { return instance; } 
    } 

    private object padlock = new object(); 

    public void AddItem(string item) { 
     lock (padlock) { 
      items.Add(item); 
     } 
    } 
} 

¿Es necesario bloquear incluso cuando se obtienen elementos de la lista interna?

La idea es que luego tendremos una tarea separada ejecutándose para tomar los elementos de indexqueue y agregarlos al índice lucene.

Gracias Ben

+2

Existen implementaciones seguras para subprocesos en .NET 4 (si es que se puede usar incluso 4), no estoy seguro de si era consciente o no, ya que veo que está ejecutando su propio ... http: //msdn.microsoft.com /en-us/library/system.collections.concurrent.aspx –

+0

Gracias chicos. Echaré un vistazo a System.Collections.Concurrent –

+0

No creo que 'System.Collections.Concurrent' te sea útil. No hay un equivalente de 'Lista' e incluso si aún así usted tuviera que aplicar su propio bloqueo para hacer que la enumeración de los elementos sea atómica.Realmente depende de cómo quiera que varios subprocesos perciban la enumeración. –

Respuesta

37

Su aplicación parece seguro para subprocesos, a pesar de que se necesidad de bloquear al leer de items así - no se puede leer con seguridad si hay una operación simultánea Add. Si alguna vez lo enumera, también necesitará bloquearlo y tendrá que vivir tanto tiempo como el enumerador.

Si puede usar .net 4, le sugiero que consulte el espacio de nombres System.Collections.Concurrent. Cuenta con algunas colecciones bien probadas y probadas que son seguras para subprocesos y, de hecho, optimizadas en torno al acceso de múltiples subprocesos.

+8

+1 para 'System.Collections.Concurrent' –

4

¿Es necesario bloquear incluso cuando conseguir artículos de la lista interna?

La clase List no es segura para subprocesos cuando realiza modificaciones. Es necesario bloquear si:

  • Utiliza una única instancia de la clase de varios hilos.
  • El contenido de la lista puede cambiar mientras está modificando o leyendo de la lista.

Probablemente el primero es cierto, de lo contrario no harías la pregunta. El segundo es claramente cierto porque el método Add modifica la lista. Entonces, sí, lo necesitas.

Cuando se agrega un método a su clase que le permite leer los artículos de vuelta, también es necesario bloquear, y lo más importante que debe utilizar el mismo objeto bloqueo como lo hizo en AddItem.

2

Sí; mientras que la recuperación no es intrínsecamente insegura operación, si también está escribiendo en la lista, entonces corre el riesgo de recuperar en el medio de una escritura.

Esto es especialmente cierto si esto funcionará como una cola tradicional, donde una recuperación realmente eliminará el valor recuperado de la lista.

Cuestiones relacionadas