Esiste una condizione di competizione per più thread su più core che cercano di bloccare una variabile globale?

-1

Capisco in un sistema single core, più thread operano in sequenza, programmati dal sistema operativo. Quindi non è possibile avere una condizione di gara poiché per definizione stanno alternando a turno una variabile.

Tuttavia, se ho un processore multicore, è possibile che vengano eseguiti contemporaneamente più thread dello stesso processo e quindi entrambi tentano di bloccare una variabile nello stesso momento?

Ad esempio, ho un semaforo globale s = 1

Se 2 thread su core differenti funzionassero contemporaneamente, entrambi tenterebbero di decrementare il semaforo e avere successo in condizioni di gara.

In un singolo core, 2 thread operano in sequenza (pianificato dal sistema operativo), quindi non è possibile, poiché il secondo thread vedrà s = 0 dal momento in cui è pianificato.

Quindi mi chiedo se ho un processo che genera più thread, e ho più core, ciò che sta fermando la condizione di competizione in cui 2 thread in esecuzione contemporaneamente vedono il semaforo globale come s = 1 allo stesso tempo e tentano di operare su di esso?

    
posta Chowza 02.09.2018 - 20:40
fonte

1 risposta

2

I understand in a single core system, multiple threads operate in sequence, scheduled by the OS.

Lo fanno, anche se ci sono due potenziali tipi di modelli di threading, che vanno a fare la natura del "turno" o fetta della CPU offerta a un thread dal sistema operativo: cooperativo e interrotto - il primo richiede al programmatore di restituisce periodicamente, e quest'ultimo usa l'orologio della CPU e altri interrupt del dispositivo I / O per determinare quale codice eseguire successivamente.

La maggior parte dei sistemi operativi moderni offre thread interrotti anziché thread cooperativi: funzionano meglio per carichi di lavoro molto indipendenti e funzionano meglio anche su architetture multi-CPU, quindi non discuterò ulteriormente i thread cooperativi.

Hence it can't be possible to have a race condition since by definition they are taking turns locking a variable.

Generalmente non è il caso dato che, con i thread moderni, la granularità della potenziale interruzione è molto piccola: tra due istruzioni di due codici macchina. Per questo motivo, questi thread sono ancora soggetti a condizioni di competizione, dal momento che molte operazioni che potremmo considerare in un linguaggio di alto livello si espandono su più istruzioni macchina.

Quindi, per i thread interdipendenti - cioè lavorando sulle stesse strutture dati in memoria, singola CPU o multi-CPU - i thread dovrebbero annunciare quando iniziano a lavorare su dati condivisi che potrebbero portare a una gara. Per fare ciò, l'hardware garantisce che alcune operazioni primitive minime siano atomiche (eseguite atomicamente - o interrotte) su tutte le CPU e il software utilizza queste caratteristiche hardware per comporre sezioni critiche, blocchi e / o transazioni più grandi.

Vedi ad esempio il protocollo MESI , che è un meccanismo tramite il quale le CPU usano le loro cache per comunicare lo stato di queste operazioni primitive.

    
risposta data 03.09.2018 - 03:06
fonte

Leggi altre domande sui tag