Witam.
W aplikacji wielowątkowej:
- W jednym wątku mam pętle, która pobiera zdarzenia
// Watek 1
while(true)
{
THREAD_LOCK(events->lock);
if(events->GetEvent(&event,THREAD_MAIN))
{
switch(event->getEventType())
{
case COS_SIE_DZIEJE:
break;
}
}
THREAD_UNLOCK(events->lock);
}
Tak samo jest tez w drugim wątku
// Watek 2
while(true)
{
THREAD_LOCK(events->lock);
if(events->GetEvent(&event,THREAD_MAIN))
{
switch(event->getEventType())
{
case COS_SIE_DZIEJE:
break;
}
}
THREAD_UNLOCK(events->lock);
}
Lecz w 3 wątku są funkcje które są wywoływane i dodawane są zdarzenia:
// 3 Wątek
// Przykładowa funkcja ktora dodaje zdarzenie
void EventSystem::onCosSieDzieje()
{
// o tego locka będzie chodziło w dalszym tekscie
THREAD_LOCK(lock);
Event* event = new Event(COS_SIE_DZIEJE);
AddEvent(event);
// i tego unlocka
THREAD_UNLOCK(lock);
}
I jest problem...
w funkcji OnCosSieDzieje jest lock którego wyróżniłem komentarzem kiedy go usune to program działa jak należy, ale jeśli nie to po kilkunastu sekundach działania programu program się deadlockuje.
Inaczej jest jeżeli w pętli nieskonczonej pomiędzy pobraniem zdarzeń w wątku nr 1 i w wątku nr 2 dodam Sleep, np Sleep(1), wtedy program deadlockuje się ale po kilkunastu lub kilku minutach działania programu.
W programie nie występują inne locki events->lock, które mogłyby wywołać deadlocka...
Czy możliwe, że np coś takiego:
while(true)
{
THREAD_LOCK(events->lock);
THREAD_UNLOCK(events->lock);
}
ze względu na brak uśpienia wątku (Sleep)
jest traktowane jako jeden długi lock, i dlatego jest deadlock?
ale przecieŻ nawet gdy dam Sleep(1), to deadlock wystepuje ale dopiero po kilku, kilkunastu mintutach
PS. Obiekt events to globalny singleton klasy EventSystem
więc...
Co się dzieje?
Z góry dziękuje za pomoc