Потокобезопасные пользовательские данные с этим примером 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++, который показывает один из способов, как это сделать.

Другие вопросы по тегам