2012-04-13 10 views
5

int val = memLoc[index++];¿Puedo hacer que el siguiente código sea libre/atómico?

o mejor aún

int val = memLoc[index++ & 0xFF];

Tratar de hacer un multi-hilo leer desde una memoria cíclica compartido donde cada llamada obtiene el siguiente valor - y me encantaría que fuera cerradura libre si en todo es posible, ya que sucede un TON. No Boost/C++ 11 permitido :(

+3

Quizás le interese leer [este artículo] (http://www.codeproject.com/Articles/43510/Lock-Free-Single-Producer-Single-Consumer-Circular). –

+3

No C++ 11 significa que necesita una solución preestablecida. Si Boost es inaceptable, entonces todas las otras bibliotecas (con sus términos de licencia más estrictos) presumiblemente también están fuera, por lo que no puede obtener nada portátil. Entonces, ¿qué sistema operativo necesita esto? – MSalters

+0

¿Qué tipo es 'memLoc'? ¿Es un puntero (o matriz) en 'int'? –

Respuesta

6

La única operación aquí que necesita sincronizarse es el incremento del valor index. Como este es solo un valor numérico, se puede hacer sin el uso de bloqueos a través de un incremento atómico. el resto de las operaciones que enumeró son sólo lee de una ubicación compartida y no necesitan estar sincronizados.

en Win32 haciendo que el incremento sincronizado que se hace con la función InterlockedIncrement

int oldValue = InterlockedIncrement(&index); 
int val = memLoc[oldValue & 0xFF]; 

Hay varios sincronizada incremente las funciones disponibles en Linux. Hay bastante goo d discusión acerca de las opciones de este hilo StackOverflow

+2

En C++ 11, hay 'std :: atomic_fetch_add' que debería ser el truco. –

+0

¿Hay arquitecturas donde escribir un 'int' no sería atómico (donde tendría que sincronizar la lectura del elemento)? –

+0

@MarkB el problema no es solo la escritura atómica del elemento, es la escritura atómica + lectura del valor anterior + lo que garantiza que se ve en todos los procesadores. Por lo general, necesitas una instrucción especial para eso. Mirando mi respuesta, utilicé atómica en un par de lugares. Ir a limpiar eso. – JaredPar

1

que había necesidad de incrementar y leer de nuevo índice en una operación atómica. Lamentablemente, el operador ++ no garantiza ninguna atomicidad.

La mayoría de los procesadores tienen algún tipo de instrucción de incremento de almacenamiento que se puede usar. Puede insertar el ensamblaje en línea para hacer eso. http://en.wikipedia.org/wiki/Fetch-and-add

Si se está ejecutando en Windows, MS proporciona una API para acceder a este: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684122(v=vs.85).aspx

Si estás en otro sistema operativo, no hay funcionalidad probablemente similar. Sin embargo, en cualquier caso, necesitará un sistema operativo o un tipo de acceso más bajo para obtener un atomic fetch-increment-store.

Cuestiones relacionadas