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 :
ainsi que mon code du signal :
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
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);
Je ne sais pas où se trouve l'erreur...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); } }
Merci
Partager