Я пишу dfs, используя boost :: asio на основе примера сервера чата boost (https://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/chat/chat_server.cpp). Обработка каждого сообщения на главном сервере начинается с чтения сообщения из сокета объектом Session (который в основном является аналогично объекту chat_session в приведенном выше примере), который затем отправляется объекту Server_Group для анализа.
Итак, когда есть два разных сообщения из разных сокетов, они сначала одновременно обрабатываются разными объектами сеанса, а затем они вызывают один объект server_group, и затем все вылетает.
Мне кажется, что я избежал состязаний в объекте server_group, но я довольно новичок в параллельном и асинхронном программировании, поэтому я в принципе не знаю, что пошло не так.
Метод, который вызывается из обеих сессий и где все это якобы вылетает (я распечатал «местоположение» потока в коде, и сбой происходит, когда один поток находится внутри метода parse_possible_sequence, а другой пытается его вызвать) :
void Server_Group::parse_possible_sequence(server_participant_ptr server, std::string message, int header_code){
if (header_code == 2) {
if (strcmp(continuous_messages[server].c_str(), "") == 0) {
parse(server, message);
} else {
continuous_messages[server] += message;
parse(server, continuous_messages[server]);
continuous_messages[server] = "";
}
}
else{
continuous_messages[server] += message;
}
}
server_participant_ptr - базовый класс класса Session.
Поля Server_Group:
std::unordered_map<int, server_participant_ptr> participants_;
enum { max_recent_msgs = 100 };
chat_message_queue recent_msgs_;
std::atomic<int> current_id = {0};
std::unordered_map<server_participant_ptr, std::string> continuous_messages;
Server_Group *other_group_;
Итак, мой вопрос: что я делаю не так?