bonjour
je tente d'utiliser la fonction pthread_cond_wait
mais ça me parait plutôt opaque (et surtout ça marche pas fort)
j'ai le code suivant
avec pour l’exécution
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 pthread_mutex_t seq_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t seq_var = PTHREAD_COND_INITIALIZER; void wait() { cout << "* debut wait" << endl; pthread_mutex_lock(&seq_mutex); cout << ">>>>> signal " << endl; pthread_cond_signal(&seq_var); //pthread_mutex_unlock(&seq_mutex); cout << "* fin wait" << endl; } void *functionSequement(void *seq) { int i = 0; cout << "- function " << i++ << endl; wait(); cout << "- function " << i++ << endl; wait(); cout << "- function " << i++ << endl; wait(); cout << "- function " << i++ << endl; wait(); cout << "- function " << i++ << endl; wait(); cout << "- function " << i++ << endl; }
le code pthread_cond_wait libere bien le mutex la premier fois mais on se sort jamais du pthread_cond_wait
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 if (true) { cout << endl << "* sequencement" << endl; pthread_t thread1; pthread_mutex_lock(&seq_mutex); pthread_create(&thread1, NULL, functionSequement, NULL); sleep(2); while (true) { cout << "entrez un caractere "; char c; cin >> c; if (c == 'q') break; if (c == 'x') { cout << " Attente condition var" << endl; pthread_cond_wait(&seq_var, &seq_mutex); cout << " Fin attente condition var" << endl; } } cout << " FIN SAISIE" << endl; pthread_join(thread1, NULL); }
j'ai bien tenté de mettre dans le wait() la ligne pthread_mutex_unlock(&seq_mutex);
mais après on ne retombe pas sur le blocage du mutex et ça donne n'importe quoi
en fait ce que j'aimerais avoir c'est avec un seul mutex
- blocage du wait() sur ce mutex
- pthread_cond_wait libere le mutex
- dans wait() on signal qu'on a transité
j'ai tenté tout un tas de configuration mais ca marche pas
en gros je veux bloquer tout le temps le wait et juste avoir une notification dans le thread main que deblocage c'est bien fait
c'est pour une sorte de séquenceur
merci
Partager