2010-01-14 17 views
62

Qual è la differenza tra semafori e mutex forniti dalla libreria pthread?pthreads mutex vs semaforo

+11

semafori non sono forniti da pthreads, e può essere utilizzato in programmi non filettati pure. – ephemient

+5

qualsiasi costrutto di sincronizzazione può essere utilizzato nel codice senza thread: P –

+4

Bene, la differenza che intendevo evidenziare era che i semafori erano in uso prima di pthreads. È possibile inserire un 'sem_t' nella memoria condivisa e utilizzarlo per sincronizzare le operazioni tra i processi. D'altra parte, anche se non si creano più thread, è necessario compilare & link con '-pthread' per usare' pthread_mutex_ * '. (Alcune piattaforme non lo applicano, ma questo è lo standard.) – ephemient

risposta

66

i semafori hanno un contatore sincronizzato e i mutex sono solo binari (vero/falso).

Un semaforo viene spesso utilizzato come meccanismo definitivo per rispondere al numero di elementi di una risorsa in uso, ad esempio un oggetto che rappresenta n thread di lavoro potrebbe utilizzare un semaforo per contare quanti thread di lavoro sono disponibili.

La verità è che è possibile rappresentare un semaforo con un INT sincronizzato da un mutex.

+3

impostando il contatore su 1 (qualunque valore rappresenti) il semaforo diventa un mutex – stacker

+1

Significa che mutex e semafori binari sono uno e lo stesso – cppdev

+5

No see http://www.opengroup.org/onlinepubs/009695399/functions/ sem_wait.html e http://www.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_lock.html. –

7

mutex viene utilizzato per evitare condizioni di competizione tra più thread.

mentre semaforo viene utilizzato come elemento di sincronizzazione utilizzato su più processi.

mutex non può essere sostituito con un semaforo binario, poiché un processo attende il semaforo mentre un altro processo rilascia semaforo. Nel caso di mutex sia l'acquisizione che il rilascio sono gestiti dallo stesso.

+1

(-1) Generalizzazione errata: per uno, i mutex possono essere condivisi tra i processi, ad esempio: http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx. Se il tuo sistema non ha il nome di mutex, basta mappare la memoria condivisa e crearne una tua. –

+1

Non è giusto contrassegnarlo come "non utile". Ho lavorato su M $ un bel po '. È facile dire a qualcuno di usare la memoria condivisa. su M $, tutti gli oggetti del kernel sono nominati e condivisi. Mutex è un oggetto del kernel. Un mutex pthread è un CRITICAL_SECTION in M ​​$. Non c'è modo di condividere CRITICAL_SECTION tra processi! – hackworks

+0

@hackworks - pthread_mutex può essere inizializzato con il flag "_POSIX_THREAD_PROCESS_SHARED" che consente di lavorare in ambiente interprocesso: http://linux.die.net/man/3/pthread_mutexattr_init – killdaclick

0

I mutex possono essere applicati solo ai thread in un singolo processo e non funzionano tra i processi come fanno i semafori.

2

Questi due articoli spiegano grandi dettagli su mutex vs semaphores anche this risposta overflow dello stack racconta la risposta simile.

16

Ho intenzione di parlare di Mutex vs Binary-Semaphore. Ovviamente si utilizza il mutex per impedire l'accesso ai dati in un thread da un altro thread allo stesso tempo.

(Si supponga di aver appena chiamato lock() e nel processo di accesso a un dato. Ciò significa che non ci si aspetta nessun altro thread (o un'altra istanza dello stesso thread-code) per accedere allo stesso dati bloccati dallo stesso mutex. Cioè, se è lo stesso thread-code che viene eseguito su un'istanza thread diversa, colpisce il blocco, quindi il lock() dovrebbe bloccare il flusso di controllo.)

Questo si applica a un thread che utilizza un thread-code diverso, che sta anche accedendo agli stessi dati e che è anche bloccato dallo stesso mutex.

In questo caso, sei ancora in procinto di accedere ai dati e potresti prendere, diciamo, altri 15 secondi per raggiungere lo sblocco di mutex (in modo che l'altro thread che viene bloccato in blocco mutex si sblocchi e consentire al controllo di accedere ai dati).

Hai mai permesso ad un altro thread di sbloccare lo stesso mutex e, a sua volta, consentire al thread che è già in attesa (blocco) nel blocco mutex di sbloccare e accedere ai dati? (Spero tu abbia quello che sto dicendo qui.)

Secondo concordato una definizione universale,

  • con “mutex” questo non può accadere. Nessun altro thread può sbloccare il blocco
  • nella serratura con "binario-semaforo" ciò può accadere.Qualsiasi altro thread può sbloccare il blocco nel tuo thread

Quindi, se siete molto particolare sull'utilizzo di binary-semaforo, invece di mutex, allora si dovrebbe essere molto attenti nella “scoping” le serrature e sblocca, voglio dire , che ogni flusso di controllo che colpisce ogni serratura dovrebbe colpire una chiamata di sblocco e inoltre non dovrebbe esserci alcun "primo sblocco", piuttosto dovrebbe essere sempre "primo blocco".

+0

Mi piace la parte ** scope **. Si riferisce alla parte di implementazione che differisce nel semaforo e mutex binari. – shuva

1

Il semaforo è più utilizzato come flag, per il quale in realtà non è necessario portare RTOS/OS. Il semaforo può essere modificato accidentalmente o deliberatamente da altri thread (ad esempio a causa di una cattiva codifica). Quando si utilizza il thread mutex, possiede le risorse. Nessun altro thread può mai accedervi, prima che la risorsa venga liberata.

+0

Io voto per la parte di bandiera. – shuva

2

La differenza tra la semaphore e mutex è la differenza tra meccanismo e modello. La differenza è nel loro scopo (intent) e come funzionano (comportamentale).

Il mutex, barrier, pipeline sono modelli di programmazione parallela. Mutex viene utilizzato (destinato) per proteggere un critical section e garantire mutual exclusion. Barrier rende gli agenti (thread/processo) in attesa l'uno dell'altro.

Una delle caratteristiche (comportamento) di mutex modello è che solo agente consentito (s) (processo o thread) può immettere una sezione critica e solo l'agente (s) può ottenere volontariamente da quello.

Ci sono casi in cui mutex consente l'agente singolo alla volta. Ci sono casi in cui consente più agenti (più lettori) e non autorizza altri agenti (scrittori).

Il semaphore è un meccanismo utilizzabile (destinato) per implementare modelli differenti. È (comportamento) in genere una bandiera (eventualmente protetta dall'esclusione reciproca). (Un fatto interessante è che anche lo schema mutex può essere utilizzato per implementare il semaforo).

Nella cultura popolare, semaphores sono meccanismi forniti dai kernel e mutexes sono forniti dalla libreria dello spazio utente.

Nota, ci sono idee sbagliate su semaphores e mutexes. Dice che semaphores vengono utilizzati per synchronization. E mutexes ha ownership. Ciò è dovuto ai popolari libri OS. Ma la verità sono tutti i mutex, i semafori e le barriere vengono utilizzati per la sincronizzazione. L'intento di mutex non è ownership ma mutual exclusion. Questo equivoco ha sollevato la questione della popolare intervista chiedendo la differenza tra mutexes e binary-semaphores.

Sintesi,

intento
  • mutex, mutua esclusione
  • semaforo, implementare modelli di progettazione parallele
comportamento
  • mutex, solo l'agente consentita (s) entra critica sezione e solo esso (loro) può uscire
  • semaforo, entrare se il flag dice andare, altrimenti attendere che qualcuno cambia la bandiera

In vista del design, mutex è più simile state-pattern in cui l'algoritmo che viene selezionato dal Stato può modificare lo stato. Lo binary-semaphore è più simile a strategy-pattern dove l'algoritmo esterno può modificare lo stato e infine l'algoritmo/strategia selezionata per l'esecuzione.

1

The Toilet Esempio

Mutex:

è la chiave per una toilette. Una persona può avere la chiave - occupare il bagno - al momento. Al termine, la persona dà (libera) la chiave alla prossima persona in coda.

"I mutex vengono in genere utilizzati per serializzare l'accesso a una sezione di codice rientrante che non può essere eseguita contemporaneamente da più thread. Un oggetto mutex consente solo un thread in una sezione controllata, forzando altri thread che tentano di ottenere accedere a quella sezione per attendere che il primo thread sia uscito da quella sezione. "

(A mutex è davvero un semaforo con valore 1.)

semaforo:

è il numero di chiavi WC identici liberi. Ad esempio, diciamo che abbiamo quattro bagni con serrature e chiavi identiche. Il conteggio dei semafori - il conteggio dei tasti - è impostato su 4 all'inizio (tutti e quattro i bagni sono gratuiti), quindi il valore del conteggio viene decrementato quando le persone arrivano. Se tutti i servizi igienici sono pieni, vale a dire. non ci sono chiavi libere, il conteggio del semaforo è 0. Ora, quando eq. una persona lascia la toilette, il semaforo viene aumentato a 1 (una chiave gratuita) e dato alla persona successiva in coda.

"Un semaforo limita il numero di utenti simultanei di una risorsa condivisa fino a un numero massimo.I thread possono richiedere l'accesso alla risorsa (decrementando il semaforo) e possono segnalare che hanno finito di utilizzare la risorsa (incrementando il semaforo)."

Source