Tengo un error extraño en mi código. Es extremadamente raro (sucede una vez cada pocas semanas tal vez), pero está allí y no estoy seguro de por qué.Problemas de cola .NET multiproceso
Tenemos 2 hilos de ejecución, 1 hilo recibe mensajes de red y los añade a una cola de esta manera:
DataMessages.Enqueue(new DataMessage(client, msg));
Otro hilo lleva mensajes de esta cola y las manijas, así:
while (NetworkingClient.DataMessages.Count > 0)
{
DataMessage message = NetworkingClient.DataMessages.Dequeue();
switch (message.messageType)
{
...
}
}
Sin embargo, de vez en cuando obtengo una NullReferenceException en la línea switch (message.messageType)
y puedo ver en el depurador que el mensaje es nulo.
No es posible que se haya puesto un valor nulo en la cola (vea el primer bit del código), y estas son las únicas 2 cosas que usan la cola.
¿Queue no es seguro para subprocesos, podría ser que estoy arrastrando en el momento exacto en que el otro subproceso está en cola y esto causa la falla?
muy pocas cosas en .NET BCL son seguras para hilos de esta manera. En este caso, "para garantizar la seguridad del subproceso de la Cola, todas las operaciones se deben realizar a través del contenedor devuelto por [Sincronizado] (http://msdn.microsoft.com/en-us/library/system.collections.queue .aspx) método ". Su problema también podría ser que dos hilos estén en secuencia o dequeue simultáneamente, si corresponde. De cualquier manera, la seguridad de la rosca es su responsabilidad. – bzlm
+1, Buena pregunta, realmente demuestra una condición de carrera y su resultado (situación corrupta/inestable/inesperada). –
Por la apariencia de tu código, parece que estás haciendo un ciclo ingenuo para tus hilos. Debería considerar la implementación de un [buffer-buffer] adecuado (http://en.wikipedia.org/wiki/Producer-consumer_problem) para sincronizar esto. –