Domanda

Ho alcune strutture di dati immutabili che vorrei da gestire con i conteggi di riferimento, la loro condivisione attraverso le discussioni su un sistema SMP.

Ecco cosa gli sguardi codice di rilascio, come:

void avocado_release(struct avocado *p)
{
    if (atomic_dec(p->refcount) == 0) {
        free(p->pit);
        free(p->juicy_innards);
        free(p);
    }
}

non atomic_dec bisogno di una barriera di memoria in esso? Se è così, che tipo di barriera di memoria?

Notizie aggiuntive: La domanda deve essere eseguito su PowerPC e x86, in modo che qualsiasi informazioni specifiche del processore è accolto favorevolmente. So già sui GCC comandi incorporati atomiche. Per quanto riguarda l'immutabilità, la refcount è il solo campo che cambiamenti nel corso della durata dell'oggetto.

È stato utile?

Soluzione

Il 86, si trasformerà in un blocco prefissato assemblaggio di istruzioni, come LOCK XADD.
Essendo una singola istruzione, è non interrompibile. In qualità di "feauture", ha aggiunto, i risultati prefisso di blocco in una barriera memoria piena:

  

"... bloccato le operazioni di serializzare tutte le operazioni di carico e memorizzare in circolazione (che è, attesa per loro di completare)." ... "operazioni bloccate sono atomico rispetto a tutte le altre operazioni di memoria e tutti gli eventi esternamente visibili. Solo di ricupero e accessi tabella pagine può passare istruzioni bloccati. Istruzioni bloccati possono essere utilizzati per sincronizzare i dati scritti da un processore e letti da un altro processore ". - Intel® 64 e IA-32 Architetture Software Developer manuale, Capitolo 8.1.2.

Una barriera memoria è infatti implementato come LOCK OR fittizio o LOCK AND sia .NET e JAVA JIT su x86 / x64.
In modo da avere una recinzione completa su x86 come bonus aggiuntivo, che vi piaccia o no. :)

Il PPC, è diverso. Un LL / SC coppia - lwarx & stwcx - con un interno sottrazione può essere usato per caricare l'operando memoria in un registro, sottrarre uno, allora o scrivere di nuovo se non ci fosse altro negozio nella posizione di destinazione, o ripetere l'intero ciclo se ci fosse. Un LL / SC può essere interrotto.
Inoltre non significa una recinzione completa automatica.
Questo, tuttavia, non compromette l'atomicità del contatore in alcun modo.
Significa solo che nel caso x86, vi capita di avere un recinto così, "gratuitamente".
su PPC, si può inserire un recinto pieno emettendo un (lw)sync istruzioni .

Tutto sommato, le barriere memoria esplicita non sono necessari per il contatore atomica per funzionare correttamente.

Altri suggerimenti

È importante distinguere tra accessi atomici (che garantisce che il Lettura / modifica / scrittura dei esegue valore come un'unità atomica) e la memoria riordino.

barriere di memoria impediscono riordino di lettura e scrittura e riordino è completamente ortogonale atomicità. Per esempio, su PowerPC se si implementa il più efficiente possibile incremento atomica allora non impedirà riordino. Se si vuole evitare che il riordino, allora avete bisogno di un lwsync o istruzione di sincronizzazione, o qualche equivalente di alto livello (C ++ 11?) Barriera di memoria.

sostiene che non c'è "alcuna possibilità di compilatore riordinare le cose in modo problematico" sembrano ingenui da affermazioni generali perché le ottimizzazioni del compilatore può essere molto sorprendente e perché le CPU (PowerPC / ARM / Alpha / MIPS in particolare) operazioni di memoria in modo aggressivo di riordino .

Una coerente della cache non salva neanche. Vedere http://preshing.com/ per vedere come la memoria riordino funziona davvero.

In questo caso, però, credo che la risposta è che senza barriere sono necessari. Questo perché per questo caso specifico (conteggio di riferimento) non v'è alcuna necessità di un rapporto tra il conteggio di riferimento e gli altri valori nell'oggetto. L'unica eccezione è quando il conteggio dei riferimenti raggiunge lo zero. A questo punto è importante garantire che tutti gli aggiornamenti di altri fili sono visibili al thread corrente così una barriera di lettura acquisiscono potrebbe essere necessario.

Stai intenzione di implementare il proprio atomic_dec o siete semplicemente chiedendo se una funzione fornito dal sistema si comporterà come si desidera?

Come regola generale, forniti dal sistema atomico strutture incremento / decremento si applicano indipendentemente barriere di memoria sono necessari per solo fare la cosa giusta. In genere non c'è bisogno di preoccuparsi di barriere di memoria a meno che non si sta facendo qualcosa di stravagante come attuare le proprie strutture di dati senza blocchi o una libreria di STM.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top