Я столкнулся с проблемой дизайна, касающейся синхронизации потоков в C ++, Windows.
Я пишу серверное приложение, которое запускает один прослушивающий поток, который должен оставаться активным все время, пока сервер работает.Когда прослушивающий поток получает запрос connect , он открывает сокет CONTROL и запускает новый поток control .Этот поток используется для отправки управляющих данных между сервером и клиентом, инициализации сервера и всего фонового программного обеспечения для конкретных данных клиента и запуска обработки данных.
Если инициализация (через управляющий сокет) прошла успешно, control поток откроет новый сокет, сокет DATA, который затем используется для передачи данных с сервера на клиент.Он также запустит два новых потока, один из которых отправляет на этот новый сокет DATA, а другой - на сокет CONTROL, ожидая, если клиент захочет разорвать соединение.
Когда клиент разорвет соединениенеблагоразумно, завершив приложение без вызова функции, которая отправляет серверное сообщение, чтобы закрыть соединение, вот что должно произойти:
- Любой из выполняющихся потоков может обнаружить это событие.Они получат какую-то ошибку (WSAECONNRESET) при отправке или получении через сокет DATA / CONTROL, а затем должны сообщить всем другим потокам, что они должны прекратить выполнение (кроме потока прослушивания сервера).
Какой самый естественный способ добиться такого поведения?
(я использую winsock (winsock2.h) для работы в сети и стандартный api-интерфейс windows (windows.h) для многопоточности)