work with threads thread net multiple example español book c# .net multithreading

c# - with - ¿Por qué Interlocked.Exchange no admite el tipo booleano?



thread net core (2)

No contesto la pregunta, pero como solución puede usar int en lugar de bool como lo hace C.

int m_IsFirstTime = 1; // 1 means true 0 means false. void SomeMethod() { if (1 == Interlocked.Exchange(ref m_IsFirstTime , 0)) // Do something for the first time. else // Do something for all other times. }

PD: Si hay evidencia de que la lectura es más rápida que la escritura, entonces Interlocked.CompareExchange podría ser mejor para este caso (solo una primera vez y supongo que muchas no).

¿Hay alguna razón práctica por la que el equipo .NET decidió no admitir Boolean en la operación de Interlocked.Exchange?

Uno de los ejemplos de uso es cuando desea garantizar que parte del código se ejecuta solo una vez y desea usar un indicador booleano para eso.


Sí, hay una buena razón. La implementación de los métodos interbloqueados requiere soporte de bajo nivel en el nivel del procesador. Vea esta respuesta por ejemplo. Eso es un problema cuando se define un marco que es agnóstico de la arquitectura.

Es difícil implementar las técnicas de bloqueo bajo admitidas por la clase Interlocked en tipos de datos que son una fracción del tamaño de palabra del procesador nativo. El enfoque RISC para el diseño de la CPU que fue popular hace más de 10 años lo desanimó fuertemente. La falta de coincidencia entre el tamaño del operando y el ancho del bus de memoria nativo hace que sea muy difícil de implementar. Una razón por la que la arquitectura x86 de Intel todavía está en su regazo, sobrevivió 30 años ya al no tomar los atajos. Más información de fondo sobre RISC en este artículo de wikipedia .