Pregunta

¿Cómo funciona InterlockedIncrement?

Es la preocupación sólo en sistemas multi-procesador?

¿Qué hace, deshabilitar interrupciones entre todos los procesadores?

¿Fue útil?

Solución

jcopenha es correcta, pero yo sólo quería responder a "es la preocupación sólo en sistemas multi-procesador?"

No sé lo que Interlocked está usando. Si se refiere a la c ++, entonces en un solo núcleo que "debería ser" seguro hacerlo "++ x" si x no es más grande que su "valor de bits". Escribo "debe ser", porque compilador puede optimizar de una manera extraña en la función - por ejemplo, el cambio de dos "x ++" en una normal "añadir ..., 2" en un lugar completamente diferente y un poco de su multihilo lógica puede fallar debido a que. En un multi-núcleo, incluso ++ x en un 32 bits x puede tener efectos extraños (la instrucción pueden ser "mem Inc" o "bloquear mem inc" y cuando se incrementa una dirección mem de dos CPU cuando no está bloqueado, obtener resultados extraños).

Si el "valor de bits" de la x es mayor que su CPU, entonces necesita enclavada en cualquier código multiproceso - no importa si se trata de una o de múltiples núcleos, debido a que la instrucción tiene que ser compilado en dos códigos de todos modos y asm el cambio de contexto puede ocurrir en el medio. (Esto se puede solucionar con RCU aunque)

En .NET es básicamente la misma historia, pero ha sobrecargado Incremento, en lugar de Interlocked ... y Interlocked ... 64.

Así que sí - siempre que usted escriba cosas multiproceso (incluso en un solo núcleo), sólo tiene que utilizar los incrementos entrelazados en la memoria compartida. No vale la pena tratar de ser "más inteligentes" que la máquina aquí.

Otros consejos

InterlockedIncrement funciona mediante el uso de instrucciones de nivel de máquina para incrementar y almacenar un valor de forma atómica. Significado ninguna operación se puede realizar en el valor y la ubicación de almacenamiento durante el proceso.

Es preocupante cualquier momento múltiples hilos o procesos o acceder al mismo valor. Por lo que una variable compartida en una aplicación multi-hilo, o memoria compartida para múltiples procesos.

No creo que la instrucción deshabilita las interrupciones, al menos en el hardware de tipo x86.

InterlockIncrement es definitivamente el camino a seguir si usted está preocupado por el rendimiento: InterlockIncrement incrementa una variable especificada y almacena el resultado, como una operación atómica (MSDN) pasando la variable se pasa por referencia (Interlocked.Increment (incremento ref)) . Con ++, el valor se pasa por dirección causando una ida y vuelta en la memoria cada vez que la instrucción se llama.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top