2010-03-12 9 views
11

Per le funzioni qui:MacOSX: OSAtomic vs OSAtomicBarrier

#include <libkern/OSAtomic.h> 

ci sono versioni OSAtomic e OSAtomicBarrier.

Tuttavia, la documentazione non mostra codice di esempio per:

  1. Quando è sicuro da usare solo OSAtomic, senza la versione OSAtomicBarrier
  2. Quando è che OSAtomic sarebbe pericoloso, ma OSAtomicBarrier sarebbe al sicuro

Qualcuno può fornire spiegazioni + codici di esempio?

[Le ramificazioni casuali di "tua opinione" senza codice effettivo sono inutili. Lettori: si prega di votare giù tali risposte; e risparmi vigorosamente le risposte con il codice effettivo.]

[codice C/C++ preferito; Montaggio okay.]

risposta

7

Su piattaforme Intel e uniprocessore, non importa.

Per i sistemi multiprocessore PPC, è necessario utilizzare sempre la varietà di barriera di funzioni, a meno che il negozio atomica colpisce sono dati altro della variabile atomica.

Quello che segue non sarebbe ok:

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

È necessario utilizzare una barriera qui, perché altri thread possono vedere data_structure come non aggiornati.

Tuttavia, se si utilizza una variabile atomica per qualche scopo, dove si trova da solo, è possibile omettere la barriera:

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

fine, fino a quando il valore di y non influenza la variabile di qualsiasi struttura dati condivisa.

Essenzialmente, è uno svuotamento della cache. È sempre possibile utilizzare le funzioni di barriera in modo sicuro, ma in alcuni casi è possibile migliorare le prestazioni non utilizzando le funzioni di barriera, ad esempio se y non viene utilizzato rispetto a una struttura di dati. Probabilmente non ci sono molti casi in cui è possibile utilizzare le funzioni senza la barriera.

+2

Perché non importa sui sistemi multiprocessore Intel? – anon

+0

Questo lo spiega ad un alto livello meglio di quanto posso: http://www.linuxjournal.com/article/8211 – WhirlWind

+0

Quanto segue non sarebbe ok: data_structure [y] .data ++; OSAtomicIncrement32 (y); Il prossimo codice non è corretto anche: data_structure [y] .data ++; OSAtomicIncrement32Barrier (y); – Speakus

Problemi correlati