Я провел несколько дней в сети, чтобы найти ответ на то, что написано в заголовке, но нашел только решения, которые не относятся к моей проблеме (примеры: мьютекс, алгоритмы блокировки и некоторые неблокирующие) ...
Моя проблема:
Я создаю многопользовательскую видеоигру, которую я буду использовать для моего последнего экзамена в старшей школе, используя c ++ и SFML, но я действительно не могу найти способ синхронизациивсе мои темы.В настоящее время моя программа работает с «большим» игровым потоком, потоком, который в каждом цикле обновляет все переменные, такие как позиции игрока, маркеры и т. Д., И по одному потоку на клиента, которые обрабатывают ввод / вывод tcp-сокета с помощью SFML (я мог бы это сделатьсо стандартными сокетами, но они мне нравятся), и каждый клиентский поток должен прочитать текущее состояние игры, чтобы отправить данные игроку.
Но если игровой поток изменяет данные, пока одинклиентского потока читает его, это, очевидно, приводит к ошибке сегментации.
С количеством клиентов X (по сути, моя цель - обработать все возможные клиенты, ограниченные мощностью моей машины, поэтому их может быть как 10, так и 1000).), как я могу синхронизировать все их потоки с игровым потоком?
Если я использую мьютекс или другие алгоритмы блокировки, нет необходимости использовать больше потоков, чем один.В конце игрового цикла я мог просто отправлять и получать данные от всех клиентов.Но это замедляет все, намного больше, чем многопоточная система.Один клиент с медленным соединением может замедлить все.
Что я могу сделать?Один большой поток всегда активен, изменяя все, что не должно быть остановлено, и сотни других маленьких потоков, которые должны читать данные больших потоков в реальном времени.
В любом случае, спасибо!
Если я каким-то образомпропустил цепочку вопросов, которая объясняла это, пожалуйста, сошлитесь на меня.
(Ps. Единственное, что я использую с SFML - это графическая система, примеры с winsock / linux также хороши. IЯ использую потоки c ++ 11)
Извините за мой английский: c Я приложил все усилия ...
Редактировать: использовал html br's, чтобы закончить строку: P ввод ключа не делает 'т работа