ne signaler qu'un seul thread bloqué
Salut,
j'essaie d'implémenter le probleme des lecteurs ecrivains en multithread en visual c++. Le problème est que lorsque j'ai un ecrivain réveillé, tous les autres le sont aussi (alors qu'il faudrait que le signal ne réveille qu'un seul écrivain).
Voici mon code du wait :
Code:
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 26 27 28 29
|
// créer un Win32 event
HANDLE hEvent = CreateEvent(NULL, TRUE, // TRUE=manual, FALSE=auto
FALSE, // signaled state
"WaitEvent" // name of event;
);
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST);
// mettre le event handle dans le wait set
waitSet.push_back(hEvent);
// relacher le verrou du moniteur
m_CritSection.Unlock();
// bloquer sur l'événement
DWORD dwResult = WaitForSingleObject(
hEvent, // handle
INFINITE // timeout; milliseconds or INFINITE
);
// acquerir le verrou
m_CritSection.Lock();
// détruire l'évènement
CloseHandle(hEvent);
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL); |
ainsi que mon code du signal :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
//prendre et retirer le plus vieil event handle du wait set
if (!waitSet.empty()){
HANDLE retEvent = waitSet.back();
waitSet.pop_back();
// mettre l'évènement à l'état signalé
SetEvent( retEvent);
}
} |
Je ne sais pas où se trouve l'erreur...
Merci