2010-03-12 18 views
11

Para las funciones aquí:MacOSX: OSAtomic vs OSAtomicBarrier

#include <libkern/OSAtomic.h> 

hay versiones OSAtomic y OSAtomicBarrier.

Sin embargo, la documentación no muestra código de ejemplo para:

  1. ¿Cuándo es seguro de usar Simplemente OSAtomic, sin la versión OSAtomicBarrier
  2. Cuando es que OSAtomic habría insegura, pero OSAtomicBarrier estaría a salvo.

¿Alguien puede proporcionar explicaciones + códigos de muestra?

[Divagaciones aleatorias de "su opinión" sin código real es inútil. Lectores: por favor, voten por tales respuestas; y respuestas vigoremente vivas con el código actual.]

[C/C++ code preferred; La asamblea está bien también.]

Respuesta

7

En plataformas Intel y uniprocesador, no importa.

Para los sistemas PPC multiprocesador, siempre debe usar la variedad de funciones de barrera, a menos que la tienda atómica no afecte a ningún dato otros que la variable atómica.

los siguientes no estaría bien:

data_structure[y].data++; 
OSAtomicIncrement32(y); 

Usted debe utilizar una barrera, porque hay otros hilos pueden ver data_structure como fuera de fecha.

Sin embargo, si está utilizando una variable atómica para un propósito en el que se encuentra solo, puede omitir la barrera:

// y is not used to access any other data 
OSAtomicIncrement32(y); 

bien, siempre y cuando el valor de y no afecta a la variable de cualquier estructura de datos compartidos.

Esencialmente, es una descarga de caché. Siempre puede usar de forma segura las funciones de barrera, pero en algunos casos, puede mejorar el rendimiento al no usar las funciones de barrera, como si y no se usa en relación con una estructura de datos. Probablemente no haya muchos casos en los que pueda usar las funciones sin la barrera.

+2

¿Por qué no es importante en los sistemas multiprocesador Intel? – anon

+0

Esto lo explica a un alto nivel mejor que yo: http://www.linuxjournal.com/article/8211 – WhirlWind

+0

Lo siguiente no estaría bien: data_structure [y] .data ++; OSAtomicIncrement32 (y); El siguiente código tampoco está bien: data_structure [y] .data ++; OSAtomicIncrement32Barrier (y); – Speakus

Cuestiones relacionadas