returns remarks method for comment code c# multithreading interlocked

remarks - returns c#



¿Qué está haciendo en realidad el bloqueo? (3)

Asumo que es un detalle de implementación, pero una forma de verlo es inspeccionar el código compilado JIT. Considere la siguiente muestra.

private static int Value = 42; public static void Foo() { Interlocked.Increment(ref Value); }

En x86 se genera lo siguiente.

lock inc dword <LOCATION>

El modificador de lock bloquea el bus para evitar que varias CPU actualicen la misma ubicación de datos.

En x64 se genera.

lock xadd dword ptr <LOCATION>,eax

Interlocked.Increment parece ser una de las operaciones más estándar / simples que uno tendría que realizar en código multiproceso.

Supongo que la funcionalidad del método es un patrón de clasificación que cualquier persona con experiencia en subprocesos podría replicar.

Así que, básicamente, lo que me pregunto es si alguien podría proporcionar un duplicado exacto (con una explicación de cómo funciona) de lo que el método de Interlocked.Increment entrelazados está haciendo internamente. (He buscado la fuente del método real pero no he podido encontrarlo)


Espero que sea una envoltura para la llamada a la API InterlockedIncrement64 Win32.

EDIT: Veo que fue una respuesta muy corta. Aprovechando un poco: es fácil replicar la funcionalidad de la función, pero no el rendimiento. Hay instrucciones nativas en la mayoría de las CPU que le proporcionan la instrucción atómica "Intercambio interbloqueado y adición", por lo que desea que esa instrucción se use para implementar su función, y espero que la forma más sencilla de lograrlo desde C # sea hacer la llamada a la API de win32. Para obtener más información sobre el tema, eche un vistazo a este documento técnico .


Según el señor Albahari hace dos cosas:

  • hace que la atomicidad de la operación sea conocida por el sistema operativo y la máquina virtual, de modo que, por ejemplo, las operaciones en valores de 64 bits en el sistema de 32 bits serán atómicas
  • genera full fence restringe la reordenación y el almacenamiento en caché de las variables interbloqueadas

Echa un vistazo a ese enlace - da algunos buenos ejemplos.