2011-01-05 11 views
6

Ci scusiamo per il mio inglese - Sono russo.Mutex di blocco in una discussione e sblocco nell'altra

Questo codice sarà corretto e portatile?

Attualmente nell'applicazione mira ho tre thread: due per scrivere un array e uno per la lettura E ho bisogno di questo subito dopo che uno dei thread che cambia l'array terzo thread mostra il contenuto dell'array.

risposta

10

Non lo è. Se il thread A arriva a mutex_unlock (2) prima che il thread B arrivi a mutex_lock (2), stai affrontando un comportamento indefinito. Non devi neanche sbloccare il mutex di un altro thread.

Il pthread_mutex_lock Open Group Base Specification dice così:

Se il tipo mutex è PTHREAD_MUTEX_NORMAL [...] Se un thread tenta di sbloccare un mutex che non ha bloccato o un mutex che è sbloccato, risultati comportamento indefinito.

+0

Ok. Ma per quanto riguarda lo sblocco del mutex che era stato bloccato in un altro thread? Anche un comportamento indefinito? –

+4

Come se dicesse: "se un thread tenta di sbloccare un mutex che non ha bloccato ... UB" – user562374

3

Come user562734's answer says, la risposta è no - non è possibile sbloccare un thread bloccato da un altro thread.

Per raggiungere la sincronizzazione lettore/scrittore desiderata, è necessario utilizzare le variabili di condizione - pthread_cond_wait(), pthread_cond_signal() e le relative funzioni.

+0

I semafori sono a volte utili anche in situazioni in cui si desidera poter "sbloccare il blocco di un altro thread". Sono in effetti una soluzione eccezionale per il fatto che l'utilizzo consigliato documentato di 'pthread_atfork' richiama un comportamento indefinito. :-) –

0

Alcune implementazioni consentono di bloccare e sbloccare i thread su diversi.

#include <iostream> 
#include <thread> 
#include <mutex> 

using namespace std; 

mutex m; 

void f() {m.lock(); cout << "f: mutex is locked" << endl;} 

void g() {m.unlock(); cout << "g: mutex is unlocked" << endl;} 

main() 
{ 
     thread tf(f); /* start f       */ 
     tf.join();  /* Wait for f to terminate   */ 
     thread tg(g); /* start g       */ 
     tg.join();  /* Wait for g to terminate   */ 
} 

Questo programma stampe

f: mutex è bloccato g: mutex è sbloccato

sistema è Debian Linux, gcc 4.9.1. -STD = C++ 11.

+0

L'implementazione di gcc 4.9.1 lo dice esplicitamente? Se no e hai la risposta solo dagli esperimenti, è ancora UB, anche se in questo caso sembra funzionare. –

Problemi correlati