Domanda

Mi chiedo se ho potuto leggere o scrivere il valore int condiviso senza bloccare su MIPS CPU (in particolare Amazon o del Danubio). Ciò che intendo è se tale lettura o scrittura sono atomiche (altro thread non li può interrompere). Per essere chiari -. Io non voglio evitare che la gara tra i thread, ma mi interessa se int valore stesso non sia danneggiato

Supponendo che il compilatore allinea tutti interi ai confini della parola cpu, dovrebbe essere possibile. Io uso gcc (g ++). Test mostra anche che a quanto pare funziona correttamente. Ma forse qualcuno lo sa per certo?

È stato utile?

Soluzione

Utilizzare operazioni atomiche built-in di gcc e si otterrà avvertimenti se non sono supportati: http://gcc.gnu.org/onlinedocs/ gcc-4.1.2 / gcc / Atomic-Builtins.html

Si presenta come combinazioni di addizione / sottrazione e test (almeno) sono possibili sull'hardware: http://rswiki.csie.org/lxr/ http / source / include / asm-mips / atomic.h

Altri suggerimenti

Dipende l'operazione. Avendo fissò programmi smontati abbastanza in MIPS, so che solo alcune operazioni sono atomiche.

assegnazione di un nuovo valore potrebbe essere 1 op o più, dovreste guardare il montaggio.

es:

x = 0; // move $a0, $0


x = 0x50000; // lui $a0, 0x0005


x = 0x50234; // lui $a0, 0x0005
             // ori $a0, 0x0234

o qui

qui per vedi danubio e Amazon sono MIPS32, che copre il mio esempio, e quindi non tutti i numeri interi a 32 bit immediato può essere scritto in modo atomico.

R10000 nel precedente post è MIPS64. Poiché un valore a 32 bit sarebbe la metà della dimensione del registro, potrebbe essere un carico / scrittura atomico.

Quali operazioni? E 'plausibile che int a; a=42; è atomico. Non c'è alcuna garanzia che a= a+42; è atomico, o in qualsiasi varianti come con ++. Inoltre, devi essere preoccupato per quello che l'ottimizzatore potrebbe fare, dire tenendo un valore intermedio in un registro quando conviene.

La domanda invita risposte fuorvianti.

Si può solo rispondere con autorevolezza "E 'atomica" domande su linguaggio assembly / macchina.

Qualsiasi dato C / C ++ frammento di codice non fornisce alcuna garanzia, può variare a seconda esattamente quali compilatore (e versione) si utilizza, ecc (A meno che non si chiama un po 'roba del genere intrinseca o specifico per la piattaforma che è garantito per la compilazione di un noto atomica istruzione macchina.)

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