Depende de cómo se modifique m_cur. Si está utilizando una declaración de asignación normal como m_cur--;
, entonces necesita ser volátil. Sin embargo, si se está modificando mediante una de las operaciones Interlocked, no es así porque los métodos de Interlocked insertan automáticamente una barrera de memoria para garantizar que todos los hilos obtengan la nota.
En general, usar enclavamiento para modificar los valores atómicos que se comparten entre subprocesos es la opción preferible. No solo se ocupa de la barrera de la memoria, sino que también tiende a ser un poco más rápido que otras opciones de sincronización.
Dicho esto, al igual que otros, han dicho que los lazos de votación son un enorme desperdicio. Sería mejor detener el hilo que debe esperar, y dejar que quien esté modificando m_cur se haga cargo de despertarlo cuando llegue el momento. Tanto Monitor.Wait() and Monitor.Pulse() como AutoResetEvent pueden ser adecuados para la tarea, dependiendo de sus necesidades específicas.
Haga del int una propiedad y señale el hilo, (autoResetEvent, quizás), en el método setter. Se elude el problema, se reduce el uso de la CPU y se elimina la duda volátil. –
Esto suele ser una mala idea, excepto en algunos casos excepcionales; ¿sabe por casualidad cuántos microsegundos desea esperar? –
El bucle de CPU mientras se lee 'cur' escrito por otro hilo no detectará cur out of limit si el hilo de sondeo no se está ejecutando cuando el hilo del setter escribe un valor fuera de límite. Si ha sido reemplazado en una caja sobrecargada, tendrá que esperar un medio cuántico medio antes de detectar la curva fuera de rango.Si cur regresa nuevamente al rango mientras el sondeo no se está ejecutando, no detectará en absoluto la condición fuera de rango. –