2011-04-04 16 views
7

Tengo una clase que usa un bloqueo de lectura y escritura.Prueba de cerraduras multihilo

Quiero ver si he bloqueado y protegido todos los métodos correctamente.
¿Hay un patrón de diseño para una prueba para verificar si los bloqueos están configurados correctamente?

Editar:
Algunas aclaraciones:

Es un código C# derivado de un ++/CLI Código C que tiene bloqueos en el nivel C++ ... No es tan simple. Es por eso que estoy buscando un diseño para una prueba, no un diseño de cómo bloquearlo.

Hay algunas cosas que necesitan ser cheques, mientras que multithreading:

No hay interbloqueos (más obvia)
corrección (si actualizo en 1 hilo se verá en el otro)
escritura Atómica (Si escribo en un hilo, voy a poder leer sólo cuando el valor total se escribe)
imparcialidad (podría ser más teórico que demostrar, debe ser verdad si yo uso mutex de todos modos)

+8

¿Cuenta "con cuidado" como un patrón de diseño? –

+2

Me temo que "con cuidado" no cubrirá todas las malas situaciones –

+0

-1 para el peor uso de 'Patrón de diseño' de la semana. – sehe

Respuesta

6

es posible que desee leer en SyncLock y SyncRoot que se utilizan para crear un patrón común sobre cómo l ock sus objetos. Como no desea bloquear un objeto enitre, a menudo tiene una SyncRoot que bloquea.

Un ejemplo de esto es ArrayList o ICollection, que tienen una SyncRoot que debe usar para bloquear la colección. Puede leer más sobre Thread Synchronization on MSDN.

Pero, en general, es justo como señaló Marc, ¡sé cuidadoso, prueba, prueba, prueba y prueba más!

Ejemplo de SyncLock

public class Person 
{ 
    public decimal Salary { get;set; } 
    public string Name { get; set; } 
    public readonly object SyncRoot = new object(); 
} 

continuación, usted puede acercarse a un bloqueo de esta manera:

var person = new Person { Name = "Bill", Salary = 1000000 }; 

lock(person.SyncRoot) 
{ 
    IncreasSalary(); 
} 

Un bad pattern es hacer lock(this)NUNCA hacer eso!

También hay algo llamado Double-checked locking que no es específico de .NET. Es posible que también desee leer este documento en "Strategized Locking, Thread-safe Interface, and Scoped Locking".

Comprobación de la seguridad hilo

Si desea probar la seguridad de los subprocesos recomiendo que echa un vistazo "Unit test for thread safety", los puntos de respuesta aceptada a Microsoft Chess que pueden ayudar a identificar los puntos muertos en su aplicación.

+0

Es un código C# derivado de un C++/Código CLI que tiene bloqueos en el nivel C++ ... No es tan simple. Es por eso que estoy buscando un diseño para una prueba, no un diseño de cómo bloquearlo. –

+0

@Yochai, ¿así que quieres enfatizar tu aplicación en un punto muerto? Entonces, ¿qué estás buscando es una estrategia de prueba sobre cómo verificar que tu aplicación no entre en un punto muerto? ¿Es eso correcto? –

+0

Pruebas de subprocesamiento múltiple ... El subproceso no se bloquea. Justicia. Los valores se leen correctamente, no en medio de la escritura. Hay más en multiprocesamiento que en interbloqueos –

2

Conoces el problema, ese es el primer paso. Es (generalmente) NP-completo ...Sin embargo, existen herramientas:

  • Helgrind

parte de las herramientas valgrind; esto podrá verificar el uso de las primitivas de sincronización más comunes; es posible que puedas contarlo acerca de tus propios primitivos.

  • Intel Parallel Inspector

mismo modo que vamos a describir sus propias primitivas para la validación durante el uso. Ver Intel Inspector reports a data race in my spinlock implementation

actualización acabo de encontrar que libstdc GNU (++) y gcc GNU han mejorado su apoyo de Helgrind sustancialmente, consulte las notas de la versión 4.6.x y this page

También vincula la siguiente adicional herramientas

+0

Sry perdió la etiqueta C#. No debería haber una diferencia real allí, pero hará que sea más difícil aplicar estas herramientas – sehe