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

WaitForSingleObject

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:

InitializeCriticalSection

LeaveCriticalSection

EnterCriticalSection

DeleteCriticalSection

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