multithreading - safety - Diferencia entre "hilo libre" y "hilo seguro"
thread safe java example (2)
A veces veo el término "hilo libre" para describir una clase o un método. Parece tener un significado similar o idéntico a "seguro para subprocesos".
¿Hay alguna diferencia entre los dos términos?
Acabo de hacer una investigación sobre lo que podría significar "free-threaded", y también terminé con COM. Permítanme citar primero dos pasajes de la edición de 1998 del libro Essential COM de Don Box. (El libro en realidad contiene más secciones sobre el modelo de hilo libre, pero lo dejaré así por ahora).
Un hilo se ejecuta en exactamente un apartamento a la vez. Antes de que un hilo pueda utilizar COM, primero debe ingresar a un apartamento. […] COM define dos tipos de apartamentos: apartamentos de multiproceso (MTA) y apartamentos de un solo hilo (STA). Cada proceso tiene como máximo un MTA; sin embargo, un proceso puede contener múltiples STA. Como lo indican sus nombres, varios subprocesos pueden ejecutarse en un MTA simultáneamente , mientras que solo un subproceso puede ejecutarse en una STA. […]
- De las páginas 200-201. (Énfasis añadido por mí.)
Cada CLSID en una DLL puede tener su propio
ThreadingModel
distinto. […]
ThreadingModel="Both"
indica que la clase puede ejecutarse en un MTA o en una STA.ThreadingModel="Free"
indica que la clase solo puede ejecutarse en un MTA.ThreadingModel="Apartment"
indica que la clase solo puede ejecutarse en una STA.- La ausencia de un valor de
ThreadingModel
implica que la clase solo puede ejecutarse en la STA principal. La STA principal se define como la primera STA que se inicializará en el proceso.- desde la página 204. (Formato y énfasis agregado por mí).
Entiendo que esto significa que un componente (clase) que se declara como subproceso libre se ejecuta en un MTA, donde es posible la concurrencia de varios subprocesos y se permiten explícitamente las llamadas al componente desde diferentes subprocesos; es decir. un componente de subproceso libre admite un entorno multiproceso. Obviamente, tendría que ser seguro para subprocesos para lograr esto.
Lo contrario sería un componente que está diseñado para una STA, es decir. solo permite llamadas desde un hilo particular. Dicha clase no tendría que ser segura para subprocesos (porque COM se encargará de que ningún otro subproceso que el que "ingresó" / configuró la STA puede usar el componente en primer lugar, es decir, que COM protege el componente de acceso concurrente).
Conclusión: el término COM "sin hilos" esencialmente tiene las mismas implicaciones que el término más general "seguro para subprocesos".
PD: esta respuesta asume que "seguro para subprocesos" básicamente significa algo así como "se puede tratar con accesos concurrentes (posiblemente por subprocesos diferentes)".
PPS: Me pregunto si "hilo libre" es lo opuesto a "tener afinidad de hilo".
Es posible que haya otros significados en otros contextos, pero en los casos en los que he trabajado en el pasado, "subprocesos gratuitos" significa que funciona, o al menos puede funcionar, a través de diferentes subprocesos sin ningún tipo de orden entre los apartamentos.
El contraste de los apartamentos en contraste bloquea diferentes "apartamentos" con copias separadas de datos "globales" (que, por lo tanto, no son realmente globales, cuando se piensa en ello) y permite que solo un hilo funcione en el apartamento o permite varios pero que seguirá estando separado de los que usen otros apartamentos.
Ahora, debido a que el modelo de apartamento ofrece cierta seguridad de subprocesos, algunas preocupaciones (pero no todas) sobre la seguridad de subprocesos desaparecen. Una pieza de código que está diseñada para operar en un modelo de apartamento será segura para subprocesos, pero parte o toda esa seguridad de subprocesos proviene del modelo de apartamento.
Una pieza de código roscada gratuita tendrá que proporcionar garantías plenas del grado de seguridad de hilo que reclama.
Lo que significa que prácticamente significa lo mismo que seguro para subprocesos, para cualquier propósito y propósito en los que no tenga que considerar la seguridad de subprocesos en el uso del código de apartamento.