2010-01-23 19 views
5

He buscado en Google los operadores de aumento o disminución de átomos en Mac OS X y he encontrado "OSAtomic.h", pero parece que solo puedes usar esto en el espacio del kernel.Incremento atómico en mac OS X

Jeremy Friesner me apuntaron a una multiplataforma atomic counter en la que usan ensamblado o mutex en OS X (por lo que entendí el entrelazado de ifdefs).

¿No hay algo como InterlockedDecrement o atomic_dec() en OS X?

Respuesta

7

¿Qué le hace pensar que OSAtomic es solo espacio de kernel? La siguiente compila y funciona bien.

#include <libkern/OSAtomic.h> 
#include <stdio.h> 

int main(int argc, char** argv) { 
    int32_t foo = 1; 
    OSAtomicDecrement32(&foo); 
    printf("%d\n", foo); 

    return 0; 
} 
+0

¡Geee, eso es raro! http://developer.apple.com/Mac/library/documentation/Darwin/Reference/KernelIOKitFramework/OSAtomic_h/index.html especifica OSDecrementAtomic, pero no veo ninguna referencia a OSAtomicDecrement32 aunque compila bien. Lo único que se leyó al kernel fue en un archivo de listas de correo ... Gracias PD: Si sabes por qué el documento dice diferente a tu código, me gustaría saberlo. – gaspard

+0

La parte 'libkern' no implica el _modelo de kernel_. Se ofrecen como parte del marco de desarrollo del kernel y del controlador: consulte (http://developer.apple.com/mac/library/documentation/DriversKernelHardware/Reference/libkern_ref/index.html) para obtener más información. Sin embargo, es posible que desee utilizar la variante 'OSAtomicDecrement32Barrier()'. –

+0

@ D.Shawley: No necesito la barrera de memoria ya que no estoy asignando memoria (utilizo el contador para una clase de conteo de referencia concurrente). – gaspard

1

También puede utilizar IncrementAtomic() y DecrementAtomic() a través de CoreServices:

#include <CoreServices/CoreServices.h> 

int main(int argc, char** argv) 
{ 
    int val = 0; 
    IncrementAtomic(&val); 
    DecrementAtomic(&val);  

    return 0; 
} 

Nota: el valor de retorno de estas funciones es el valor del entero antes se incrementa, así que si quieres comportamiento similar a las funciones Win32 InterlockedIncrement() y InterlockedDecrement(), necesitará crear envoltorios que +1 al valor devuelto.