Qual è la differenza tra semafori e mutex forniti dalla libreria pthread?pthreads mutex vs semaforo
risposta
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.
impostando il contatore su 1 (qualunque valore rappresenti) il semaforo diventa un mutex – stacker
Significa che mutex e semafori binari sono uno e lo stesso – cppdev
No see http://www.opengroup.org/onlinepubs/009695399/functions/ sem_wait.html e http://www.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_lock.html. –
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) 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. –
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
@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
I mutex possono essere applicati solo ai thread in un singolo processo e non funzionano tra i processi come fanno i semafori.
Questi due articoli spiegano grandi dettagli su mutex vs semaphores anche this risposta overflow dello stack racconta la risposta simile.
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".
Mi piace la parte ** scope **. Si riferisce alla parte di implementazione che differisce nel semaforo e mutex binari. – shuva
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.
Io voto per la parte di bandiera. – shuva
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
- 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.
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)."
- 1. Monitor vs Mutex
- 2. Pthreads vs. OpenMP
- 3. sincronizzato Vs Semaforo
- 4. implementazione semaforo
- 5. Dove usare il semaforo binario quando sono disponibili i mutex?
- 6. Acquisizione risorse e pthreads
- 7. Monitor vs Mutex in C#
- 8. PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init (& mutex, param)
- 9. boost :: lock_guard vs boost :: mutex :: scoped_lock
- 10. Come inizializzare un semaforo binario in C
- 11. Semaforo binario rispetto a ReentrantLock
- 12. Che cos'è il mutex e il semaforo in C#? dove dobbiamo implementare?
- 13. Perché una condizione/implementazione mutex di un semaforo richiede un ciclo "while" nella sua funzione "wait()"?
- 14. Usando della variabile condivisa dal 10 pthreads
- 15. Threading Box2D con pthreads
- 16. Nice-Level per pthreads?
- 17. tracciando pthreads in linux?
- 18. False condivisione e pthreads
- 19. Semaforo e sincronizzazione
- 20. Semaforo inverso .NET?
- 21. Come funziona il semaforo?
- 22. Filettatura e semaforo Python
- 23. Esempio di semaforo semplice
- 24. Ordine semaforo garantito?
- 25. Token di cancellazione semaforo
- 26. Come misurare la contesa di mutex?
- 27. Per mutex o non per mutex?
- 28. boost :: mutex :: ~ mutex(): Asserzione `! Pthread_mutex_destroy (& m) 'fallita
- 29. I pthreads offrono vantaggi rispetto a GCD?
- 30. pthreads v. SSE debole ordine di memoria
semafori non sono forniti da pthreads, e può essere utilizzato in programmi non filettati pure. – ephemient
qualsiasi costrutto di sincronizzazione può essere utilizzato nel codice senza thread: P –
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