2010-02-18 11 views
16

Diciamo che sto usando un gestore signal per gestire un timer intervallo.è l'assegnazione della variabile python atomica?

def _aHandler(signum, _): 
    global SomeGlobalVariable 
    SomeGlobalVariable=True 

Posso impostare SomeGlobalVariable senza preoccuparsi che, in uno scenario improbabile che, mentre l'impostazione SomeGlobalVariable (vale a dire il Python VM stava eseguendo bytecode per impostare la variabile), che l'assegnazione all'interno del gestore di segnale si romperà qualcosa? (Vale a dire metastabile Stato)

Aggiornamento: Sono specificamente interessati nel caso in cui un "assegnazione composta" è fatta al di fuori del gestore.

(forse sto pensando troppo "basso livello" e questo è tutto curato in Python ... provenienti da una Sistemi embedded fondo, non ho questo tipo di impulsi di tanto in tanto)

risposta

12

assegnazione semplice a variabili semplici è AKA "atomico" threadsafe (le assegnazioni composte come += o le assegnazioni a oggetti o attributi di oggetti non devono essere, ma il tuo esempio è un semplice assegnamento a una variabile semplice, anche se globale, quindi sicura).

+0

ma che dire di "assegnazione composta" al di fuori del gestore? – jldupont

+1

Se il gestore esegue (es.) 'Gvar = 3',' gvar' è inizialmente 7, e il codice al di fuori del gestore (es.) 'Gvar + = 2', quindi' gvar' potrebbe essere o 3, 5, o 9, a seconda di come le operazioni finiscono interlacciate. Questo è tecnicamente "sicuro" (il che significa che il processo non si bloccherà ;-) ma improbabile che sia semanticamente OK. –

+2

Dove è specificato? -1 per mancanza di riferimento autorevole. – rightfold

1

L'assegnazione del composto prevede tre passaggi: lettura-aggiornamento-scrittura. Questa è una condizione di competizione se viene eseguito un altro thread e scrive un nuovo valore nella posizione dopo che la lettura è avvenuta, ma prima della scrittura. In questo caso, un valore non aggiornato viene aggiornato e riscritto, il quale rovinerà qualsiasi nuovo valore scritto dall'altra discussione. In Python tutto ciò che comporta l'esecuzione di un singolo codice byte DOVREBBE essere atomico, ma l'assegnazione composta non soddisfa questo criterio. Usa un lucchetto.

+0

Nella situazione illustrata sopra, ho solo un singolo thread di esecuzione. Inoltre, non è che io possa "ritardare" l'esecuzione del gestore del segnale. Naturalmente posso ricorrere a una coda sicura per i thread se l'opinione della fiducia del cervello di SO lo prescrive. – jldupont

+0

Se si dispone di un singolo thread, da dove viene eseguito il gestore? Se si trova sullo stesso thread, niente può alterare lo stato mentre è in esecuzione in primo luogo. –

+0

@Max S.: sei sicuro? Guarda la risposta di @Alex Martelli. – jldupont

Problemi correlati