Потокобезопасные пользовательские данные с этим примером websocket++
Этот пример для websocket++ - это именно то, что я хочу сделать по своей сути.
Хотя пользователи могут быть легко отслежены с websocketpp::connection_hdl
Мне нужно хранить больше информации о них, например, как стек, вероятно, отслеживает, какую страницу мы просматриваем для обновления голосов, комментариев, ответов, сообщений в верхнем левом углу и т. Д.
Я только что узнал, что std::queue
не является полностью поточно- ориентированным потоком. Сбой.push() или ожидание пока заблокировано в этом примере кода? и я собираюсь найти способ (возможно, со стеком q) работать в boost::lockfree::queue
Потокобезопасная очередь C/C++, оптимизированная для push. Что еще более важно, я только что узнал, что потокобезопасные векторы намного больше проблем. Класс Threadsafe Vector для C++
Из кода в первой ссылке, как я могу отследить пользовательские данные (такие как текущий просматриваемый вопрос стека) поточно-безопасно без блокировки и блокировки?
1 ответ
На самом деле я делаю это сам в приложении websocket++, хотя я не использую экспериментальную ветку.
Что я делаю, так это то, что я создаю объект UserData (который я определил) в on_open, который принимает соединение в конструкторе. Затем я помещаю этот объект на std::map<std::string, connection_hdl>
, Строка - это сериализованное соединение, которое позволяет однозначно идентифицировать его. Вы могли бы поэкспериментировать с std::map<connection_hdl, UserData>
,
Когда я хочу найти UserData, я просто ищу соединение на карте, и оно возвращает UserData.
Затем, чтобы получить потокобезопасность, вам нужно сделать boost::unique_lock<boost::mutex>
каждый раз, когда вы получаете доступ к std::map
, Классы std практически отсутствуют, поэтому вы всегда должны добавлять таких охранников.
Изменить: Вот пример в стабильной websocket++, который показывает один из способов, как это сделать.