2013-02-18 5 views

risposta

6

Quando il mutex diventa disponibile, il primo thread che ha chiamato pthread_mutex_lock() ottiene il blocco?

No. Uno dei thread in attesa ottiene un blocco, ma quale ottiene non è determinato.

Ordine FIFO?

Il mutex FIFO è già un modello. Vedi Implementing a FIFO mutex in pthreads

+0

Per FIFO intendevo solo il primo thread per chiamare 'pthread_mutex_lock' il primo a ottenere il blocco quando è disponibile e così via per i thread successivi. Suppongo che stia implementando il mio. Grazie. – shanet

+0

@shanet: * "Volevo solo dire che il primo thread chiama' pthread_mutex_lock 'il primo a ottenere il blocco quando è disponibile "* - sì, questo è esattamente ciò che riguarda il mutex FIFO. – LihO

1

L'ordinamento FIFO è l'ordine di sveglia mutex meno efficiente possibile. Solo un'implementazione veramente terribile lo userebbe. Il thread che è stato eseguito più di recente potrebbe essere in grado di eseguire di nuovo senza un commutatore di contesto e più recentemente è stato eseguito un thread, più i suoi dati e il codice saranno caldi nella cache. Implementazioni ragionevoli provano a dare il mutex al thread che lo ha tenuto l'ultima volta il più delle volte.

Consideriamo due thread che fanno questo:

  1. acquisire un mutex.
  2. Regola alcuni dati.
  3. Rilasciare il mutex.
  4. Andare al punto 1.

Ora immaginate due thread in esecuzione di questo codice su una CPU single core. Dovrebbe essere chiaro che il comportamento mutex FIFO comporterebbe "aggiustare alcuni dati" per ogni cambio di contesto - il peggior risultato possibile.

Ovviamente, le implementazioni ragionevoli generalmente danno qualche cenno di equità. Non vogliamo che un thread non faccia progressi. Ma ciò difficilmente giustifica un'implementazione FIFO!

+0

La tua idea di "ragionevole" non è compatibile con la maggior parte. In particolare, non è compatibile con i requisiti in tempo reale; un singolo thread che blocca e sblocca rapidamente il mutex impedirà il progresso in avanti in qualsiasi altro thread. L'ordine FIFO all'interno di ciascun livello di priorità è il modo normale in cui i mutex devono comportarsi per un utilizzo in tempo reale robusto. –

+0

@R .. I mutex POSIX non sono, e non sono destinati ad essere, in tempo reale.Sono intesi a massimizzare l'avanzamento del processo nel suo insieme senza essere manifestamente ingiusti. –

+0

Per POSIX, "La funzione pthread_mutex_unlock() deve rilasciare l'oggetto mutex a cui fa riferimento il mutex.Il modo in cui un mutex viene rilasciato dipende dall'attributo type del mutex.Se ci sono thread bloccati sull'oggetto mutex a cui fa riferimento mutex quando pthread_mutex_unlock () viene chiamato, in modo che il mutex diventi disponibile, ** la politica di pianificazione determina quale thread deve acquisire il mutex **. " (sottolineatura mia) –

1

"Se ci sono thread bloccati sull'oggetto mutex a cui fa riferimento mutex quando viene chiamato pthread_mutex_unlock(), il risultato della mutex diventa disponibile, la politica di pianificazione determina quale thread acquisirà il mutex."

A parte questo, la risposta alla tua domanda non è specificata dallo standard POSIX. Può essere casuale, o può essere in FIFO o LIFO o in qualsiasi altro ordine, in base alle scelte fatte dall'implementazione.