"Thread safe" es un término un tanto desafortunado porque realmente no tiene una definición sólida. Básicamente significa que se garantiza que ciertas operaciones en el objeto se comportarán con sensatez cuando el objeto se está operando a través de múltiples hilos.
Considere el ejemplo más simple: un contador. Supongamos que tiene dos hilos que incrementan un contador. Si la secuencia de eventos va:
- Enhebrar una lectura del contador, obtiene cero.
- Enhebrar dos lecturas del contador, obtiene cero.
- Subproceso uno incrementa cero, escribe uno para contrarrestar.
- Rosque dos incrementos cero, escribe uno para contrarrestar.
Luego observe cómo el contador ha "perdido" uno de los incrementos. Las operaciones simples de incremento en los contadores no son seguras en cuanto a los hilos; para hacerlos seguras en hilos puedes usar bloqueos, o InterlockedIncrement.
De forma similar con las colas. Las colas que no son seguras para hilos no pueden "enganchar" en cola de la misma forma que los contadores que no son aptos para usar hilos pueden perder incrementos. Peor aún, las colas que no son seguras pueden incluso colapsar o producir resultados extravagantes si las usa en un escenario de subprocesos múltiples de forma incorrecta.
La dificultad con "hilo seguro" es que no está claramente definido. ¿Simplemente significa "no se bloqueará"? ¿Significa que se producirán resultados razonables? Por ejemplo, supongamos que tiene una colección "threadsafe". Es este código correcto?
if (!collection.IsEmpty) Console.WriteLine(collection[0]);
No. Incluso si la colección es "multi-hilo", que no significa que este código es correcto; otro hilo podría haber hecho que la colección esté vacía después de la verificación, pero antes de la línea de escritura y, por lo tanto, este código podría colapsar, incluso si el objeto supuestamente es "seguro para hilos". De hecho, determinar que todas las combinaciones relevantes de las operaciones es seguro para la rosca es un problema extremadamente difícil.
Ahora, para llegar a su situación real: cualquier persona que le diga "debe usar la clase Queue, es mejor porque es segura", probablemente no tenga una idea clara de lo que están hablando. En primer lugar, Queue no es inseguro. En segundo lugar, si Queue es seguro o no es completamente irrelevante si solo está utilizando el objeto en un único hilo. Si tiene una colección a la que se accederá en varios subprocesos, entonces, como indiqué en mi ejemplo anterior, tiene un problema extremadamente difícil de resolver, independientemente de si la colección en sí es "en hilo". Debe determinar que cada combinación de operaciones que realice en la colección también es seguro para la tarea. Este es un problema muy difícil, y si es uno que enfrenta, entonces debe utilizar los servicios de un experto en este tema difícil.
+1 Para el sólido testimonio de un experto. También tiene razón al señalar que "hilo seguro" es un concepto bastante difuso. –
Me gusta cómo cada pregunta relacionada con la seguridad del hilo es respondida por el mismo tipo, del que he estado leyendo durante aproximadamente 2 horas. –