C ++ Многопоточная серверная справка - PullRequest
3 голосов
/ 09 января 2011

Я работаю на многопоточном сервере в c ++, используя boost-asio. В настоящее время я сталкиваюсь с проблемой дизайна, связанной со стиранием соединения.

У меня есть один экземпляр сервера, который содержит вектор объектов подключения. Эти соединения получают команды, которые я анализирую. В частности, одна команда имеет дело с отправкой данных на ВСЕ соединения в моем векторе.

Теперь, когда соединение разрывается, я в настоящее время стираю это соединение из вектора и вызываю деструктор. Похоже, что я столкнусь с проблемами, когда кто-то «SendAll» одновременно с кем-то «Disconnect».

Может ли кто-нибудь порекомендовать лучший дизайн или просто указать мне правильное направление? Любая помощь с благодарностью. Спасибо

Ответы [ 2 ]

5 голосов
/ 09 января 2011

Независимо от того, какой класс поддерживает этот вектор соединений, требуется цепь .Используйте strand::post или strand::dispatch при доступе, добавлении или удалении из вектора.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Строковый поток * определяется как строго последовательный вызов обработчиков событий (т.е. без одновременного вызова).Использование цепей позволяет выполнять код в многопоточной программе без необходимости явной блокировки (например, с использованием мьютексов).

1 голос
/ 09 января 2011

Разве блокировка вокруг вектора не вариант? Иметь каждый доступ к вектору сначала получить блокировку; это помешает вашей расы. Пока соединения с сервером не приходят и не уходят очень часто, это не будет узким местом.

...