Próbowałem usunąć problem przy korzystaniu z wielu MVarów, ale bez powodzenia.Wątek zablokowany na czas nieokreślony w operacji MVar
Mój kod używa dwóch MVars: jednego do przechowywania stanu bieżącego serwerów, a drugiego do przekazywania zdarzeń sieciowych do i od wątków klienta. Jednak po kilkakrotnym ponownym podłączeniu i odłączeniu serwer przestaje wysyłać dane po nawiązaniu połączenia z nowymi klientami (prawdopodobnie dlatego, że zdarzenia sieciowe MVar są opróżniane z dowolnego powodu) i ostatecznie pojawia się wraz z błędem: *** Exception: thread blocked indefinitely in an MVar operation
Podjęłam następujące próby debugować ten problem w ciągu ostatnich kilku dni:
- funkcje wykorzystywane do modyfikowania MVar (y) przyzwyczajenie generują wyjątki
- problem nie występuje aż do klienta albo łączy lub łączy następnie rozłącza
- Wydaje się, że problem wystąpił domly (czasem kilku klientów może połączyć następnie rozłączyć, innym razem to się dzieje od razu)
mam pojedyncze problem do trzech plików:
- https://github.com/Mattiemus/IMC-Server/blob/master/IMC.hs (wyjątek zostaje wrzucony w
sense
) - https://github.com/Mattiemus/IMC-Server/blob/master/IMC/Networking/Server.hs (Modifined ciągu
application
handleClient
icleanupClient
) - https://github.com/Mattiemus/IMC-Server/blob/master/IMC/Utilities/Concurrency.hs (funkcje, które pchają i pop do listy przechowywanej w MVar)
Nie mam pomysłów, ponieważ używam tylko modifyMVar iMVar (więc na pewno nigdy nie powinien być całkowicie pusty) - moim jedynym założeniem jest to, że być może Wyjątek jest generowany podczas modyfikowania MVar, jednak myślę, że jest to mało prawdopodobne.
Każda pomoc jest doceniana, problem ten od pewnego czasu mnie dręczy.
Nie sądzę, że większość osób będzie chciała przeszukać tyle kodu, aby znaleźć ten błąd. Być może napisanie kilku testów pomoże ci go znaleźć. – user2407038
Zmodyfikowałem to pytanie, aby jeszcze bardziej uściślić problem na 4 główne funkcje. Jakiego rodzaju testy będę musiał napisać, aby wyizolować ten problem, problem wydaje się w końcu występować niezależnie od pogody. Usuwam wszystkie modyfikatory przez serwer lub zdarzenia MVar, co prowadzi mnie do przekonania, że w jakiś sposób używam ich niepoprawnie. Istnieje wiele producentów nad wydarzeniami MVar (jeden wątek dla każdego klienta), ale tylko jeden konsument - może to jest problem? – Mattiemus
W "znaczeniu" używasz 'MVar' bardzo podobnego do kanału. Czemu zamiast tego użyć "Chan"? –