Pregunta

En la aplicación que estoy escribiendo, tengo que escribir un montón de tipos de bases, que será muy probablemente inmutable. Pero estoy preguntando cómo mutable tipos comparan en aplicaciones paralelas a los inmutables.

Puede utilizar las cerraduras con objetos mutables, ¿verdad? ¿Cómo se compara con otras técnicas utilizadas con tipos inmutables en aplicaciones paralelas?

Tiene por lo menos lejos de usar cerraduras con tipos inmutables, ¿verdad?

¿Fue útil?

Solución

Tipos

  • Utilice los tipos inmutables tanto como sea posible.
  • Use colecciones compatibles con el proceso en lugar de bloqueos explícitos tanto como sea posible.
  • Utilice únicamente los mutables cuando no tiene otra opción razonable.

Hilos

  • piscinas Uso de hilo tanto como sea posible.
  • Use bucles sin fin cuando grupos de subprocesos no son posibles.
  • manualmente iniciar y detener las discusiones como último recurso.

Si usted tiene que utilizar bloqueos explícitos, ellos documentar a fondo. Especialmente cuando se trata de la orden en el que bloquea los objetos. Si usted sabe que los objetos Foo siempre están bloqueadas antes de objetos de barras y que Foo (clave 100) está siempre cerrada antes de Foo (clave = 200), no se va a callejones sin salida.

Otros consejos

La clave para escribir aplicaciones paralelizables es mantenerse alejado de estado compartido mutable. Compartiendo estado mutable entre hilos requiere la sincronización que normalmente implica alguna forma de bloqueo. El uso de tipos inmutables puede ayudar a asegurar que usted no está compartiendo accidentalmente estado, por lo que es imposible cambiar el estado de los objetos. Sin embargo, esto no es una bala mágica, sino simplemente una opción de diseño. Si el algoritmo que intenta poner en paralelo requiere estado compartido, vas a tener que crear algún tipo de sincronización.

La mutabilidad no afecta el bloqueo.

Cuando se utiliza tipos mutables que se está exponiendo a Write-Abierto de lectura o escritura tras escritura errores. Estos son errores de sincronización asociados con la actualización de un valor, mientras que otros hilos se concurrentemente leyendo o actualizar el valor.

Para evitar errores de sincronización debe utilizar algún tipo de mecanismo de bloqueo. Si usted hace uso explícito de bloqueo tendrá que tener mucho cuidado con el fin de adquirir las cerraduras. Si no se tiene cuidado se puede introducir puntos muertos. Por ejemplo: Hilo A adquiere Lock X, a continuación, el subproceso B adquiere Lock Y. Un rato después enhebrar una solicitudes de bloqueo Y y solicitudes de hilo B X. Lock Esto hace que ambos hilos a esperan indefinidamente para Cerraduras que nunca serán liberados

.

Dos buenas reglas de oro para el bloqueo:

  • adquirir bloqueos en un orden específico (por ejemplo, siempre adquirir Lock X antes Lock Y)
  • cerraduras suspenso por un tiempo lo más corto posible. Adquirirlas cuando los necesite, y liberarlos tan pronto como haya terminado con el.

Si nunca se escribe en un objeto después de su creación, no es necesario para bloquearlo antes de acceder a ella. Por lo tanto, no será necesario para bloquear los objetos inmutables.

Utilice los tipos inmutables cuando pueda. Utilice tipos mutables cuando se tiene que (serialización etc.).

Uso System.Threading.Tasks por toda su paralelización -. Tareas incluso se construyen con el idioma en C # 5 cuando asíncrono y esperar se añaden palabras clave

escribí un artículo sobre tipos mutables / inmutables en C #: http://rickyhelgesson.wordpress.com/2012/07/17/mutable-or-immutable-in-a-parallel-world/

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