2012-10-08 25 views
9

¿Está garantizado que no se enroscará/no producirá resultados inesperados?Interlocked.Increment una matriz de enteros

Interlocked.Increment(ref _arr[i]); 

Mi intuición me dice que esto no es así, es decir, leer el valor en _arr [i] no se garantiza que sea 'atómica' con la incrementación real.

Si estoy en lo cierto al pensar que esto está mal, ¿cómo puedo solucionarlo? Gracias.

+0

¿Quién o qué está leyendo el valor en '_arr [i]'? Este código no lo lee, lo incrementa atómicamente porque eso es lo que 'Interlocked.Increment 'hace –

Respuesta

13

Suponiendo que nada cambie i o _arr, eso debería estar bien.

Una matriz se considera como una colección de variables; un incremento entrelazado debería funcionar bien independientemente de lo que le esté sucediendo a ese elemento u otros en la misma matriz.

1

Si algo es asíncrona cambiar _arr o i entonces, estaría de acuerdo con usted, no, la búsqueda _arr[i] no es necesariamente atómica en sí.

Sin embargo, como dice Jon, una vez que haya identificado un elemento de (algunos) _arr, que se atómicamente incrementa, independientemente de otras acciones que ocurren en otros elementos de la matriz (s), o para introducir nuevos cambios en _arr o i.

Si _arr o i se están cambiando de forma asíncrona, todas las referencias a ellos (tanto de lectura y escritura) tienen que estar dentro de un lock en un objeto común. (Y luego puede reducir el Interlocked.Increment a un simple ++.

Cuestiones relacionadas