Volátil no es lo suficientemente bueno, pero prácticamente siempre funcionará porque el programador del sistema operativo siempre se bloqueará. Y funcionará bien en un núcleo con un modelo de memoria fuerte, como x86, que quema mucho jugo para mantener cachés sincronizados entre los núcleos.
Entonces, lo que realmente solo importa es qué tan rápido un hilo responderá a la solicitud de detención. Es fácil de medir, simplemente inicie un cronómetro en el hilo de control y registre el tiempo después del ciclo while en el hilo del trabajador. Los resultados que miden a partir de la repetición de tomar 1000 muestras y tomando el promedio, repetido 10 veces:
volatile bool, x86: 550 nanoseconds
volatile bool, x64: 550 nanoseconds
ManualResetEvent, x86: 2270 nanoseconds
ManualResetEvent, x64: 2250 nanoseconds
AutoResetEvent, x86: 2500 nanoseconds
AutoResetEvent, x64: 2100 nanoseconds
ManualResetEventSlim, x86: 650 nanoseconds
ManualResetEventSlim, x64: 630 nanoseconds
Ten en cuenta que los resultados para bool volátil son muy poco probable que mirar que bien en un procesador con un modelo de memoria débil, como ARM o Itanium. No tengo uno para probar.
Parece ser que quiere favorecer ManualResetEventSlim, dando una buena ejecución y una garantía.
Una nota con estos resultados, se midieron con el subproceso de trabajo ejecutando un bucle en caliente, probando constantemente la condición de detención y no haciendo ningún otro trabajo. Eso no es exactamente una buena combinación con el código real, un hilo normalmente no verificará la condición de parada con tanta frecuencia. Lo que hace que las diferencias entre estas técnicas sean en gran medida inconsecuentes.
Usaría un temporizador, en lugar de dormir. Para finalizar, podrías simplemente detener el temporizador. – Servy
He agregado algunas observaciones que pueden responder, básicamente, no creo que estos fragmentos hagan lo que usted desea. – Jodrell