#include <iostream>
#include <mutex>
#include <condition_variable>
#include <thread>
using namespace std;
int num = 1;
#define NUM 20
condition_variable odd;
condition_variable even;
mutex mut;
void thread_odd()
{
while(num < NUM -1)
{
if(num%2 != 1)
{
unique_lock<mutex> lock(mut);
odd.wait(lock);
}
cout<<"ODD : "<<num<<endl;
num++;
even.notify_all(); // Line X
}
}
void thread_even()
{
while(num < NUM)
{
if(num%2 != 0)
{
unique_lock<mutex> lock(mut);
even.wait(lock);
}
cout<<"EVEN : "<<num<<endl;
num++;
odd.notify_all();
}
}
int main()
{
thread t1(thread_odd), t2(thread_even);
t1.join();
t2.join();
return 0;
}
/* Ci-dessus est le programme pour imprimer ODD & numéros EVEN de façon synchronisée (un par un). Le code fonctionne très bien la plupart du temps. Mais il est parfois dans une impasse. Cela se produit lorsque le thread impaire frappe notify_all mais avant que le thread pair ne se réveille, le thread impair acquiert le verrou puis, lorsqu'il trouve la condition wait, il attend que le thread pair ne se réveille pas. Quitter une situation de dealock. J'ai essayé de remplacer notify_all à notify_one, mais le problème persiste toujours. Y a-t-il un changement dans la conception requise? Ou y a-t-il quelque chose qui me manque complètement? */notifyall ne fonctionne pas en multithreading C++. Cause blocage
Vous devez vous assurer que 'thread_even()' appelle 'even.wait()' avant 'thread_odd()' appelle 'even.notify_all()'. – mkcms