Ускорение потоков в программе asio приводит к аварийному завершению всего процесса при использовании одного и того же объекта - PullRequest
0 голосов
/ 04 апреля 2019

Я пишу 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_;

Итак, мой вопрос: что я делаю не так?

...