Synchronizacja wątków
Zadanie 1 - Komunikator tekstowy z wieloma klientami c. d.
Rozszerz aplikację z poprzednich zajęć w następujący sposób:
- w momencie wyczerpania wszystkich możliwych połączeń wątek główny serwera czeka na zakończenie przynajmniej jednego z wątków odpowiedzialnych za połączenia z klientami. Dopiero wtedy możliwe staje się ponowne zaakceptowanie nowego połączenia. Wykorzystaj w tym celu funkcję WaitForMultipleObjects
- po uruchomieniu serwera przyciskiem
Run
ten sam przycisk pozwala wyłączyć serwer. W momencie wyłączenia serwera do wszystkich połączonych klientów prześlij komunikat pożegnalny i zakończ wątki odpowiedzialne za połączenia oraz wątek główny serwera. Do komunikacji między wątkami wykorzystaj zdarzenia. Przydatne funkcje:- CreateEvent tworzy uchwyt do obiektu zdarzenia
- SetEvent ustawia obiekt zdarzenia w stanie sygnalizującym zajście zdarzenia
- ResetEvent przywraca pierwotny stan zdarzenia
- zabezpiecz dane modyfikowane przez wątki tak aby wyłącznie jeden wątek mógł modyfikować i odczytywać współdzielone zasoby (np. zmienne globalne). Wykorzystaj w tym celu sekcje krytyczne. Przydatne funkcje:
Uruchom aplikację w debuggerze Visual Studio i prześledź działanie wątków oraz możliwości VS w śledzeniu działania aplikacji wielowątkowych.
Źródła:
- szablon aplikacji serwerowej czat_serwer2.cpp
- przykładowa aplikacja kliencka, którą można wykorzystać do testów czat_klient.cpp