Как использовать boost Asio в асинхронном режиме в несколько потоков?

Как использовать boost Asio в асинхронном режиме в несколько потоков? Может я был невнимателен, но насколько я понял, у всех потоков может быть единый io_context и в каждом потоке просто необходимо запустить run. Но когда я так делаю и вывожу в консоль id потока, все действия выполняются в одном потоке. Что я сделал не правильно, как запустить асинхронную обработку в несокольких потоках?

#include <iostream>
#include <functional>
#include <memory>
#include <boost/asio.hpp>
#include <thread>

using boost::asio::ip::tcp;

class Session : public std::enable_shared_from_this<Session>{
private:
    tcp::socket sock;
    std::string message;
    uint16_t maxMessageLength;
private:
    Session(boost::asio::io_context& context, uint16_t maxMessageLength);
    void AfterRead(const boost::system::error_code&, size_t, std::function<void()>);
public:
    typedef std::shared_ptr<Session> SessionSharedPtr;
public:
    static SessionSharedPtr CreateNewSession(boost::asio::io_context& context, short messageLength = 2048);
    void ReceiveMessage(std::function<void()>,
                        const boost::system::error_code& err);
    void SendMessage(std::string& message,
                     std::function<void(const boost::system::error_code&, size_t)> handler,
                     const boost::system::error_code& err, size_t msgSize);
    std::string& GetMessage();
    tcp::socket& GetSocket();
    ~Session();
};

Session::Session(boost::asio::io_context &context, uint16_t maxMessageLength) : sock(context)
{
    this->maxMessageLength = maxMessageLength;
    message.resize(maxMessageLength);
}

Session::SessionSharedPtr Session::CreateNewSession(boost::asio::io_context &context, short messageLength) {
    return Session::SessionSharedPtr(new Session(context, messageLength));
}

void Session::ReceiveMessage(std::function<void()> handler,
                             const boost::system::error_code& err) {
    sock.async_read_some(boost::asio::buffer(message, maxMessageLength), std::bind(&Session::AfterRead,
                                                                                   this, std::placeholders::_1,
                                                                                   std::placeholders::_2, handler));
}

void Session::SendMessage(std::string& messageToSend,
                          std::function<void(const boost::system::error_code&, size_t)> handler,
                          const boost::system::error_code& err, size_t msgSize) {
    sock.async_write_some(boost::asio::buffer(messageToSend, maxMessageLength), handler);
}

Session::~Session() {
    sock.close();
}

std::string &Session::GetMessage() {
    return message;
}

tcp::socket &Session::GetSocket() {
    return sock;
}

void Session::AfterRead(const boost::system::error_code& err, size_t bytes, std::function<void()> handler) {
    handler();
}

boost::asio::io_context context;
tcp::acceptor acceptor(context, tcp::endpoint(tcp::v6(), 8000));

void accept(){
    auto session = Session::CreateNewSession(context);
    auto readFunc = std::bind(&Session::ReceiveMessage, session, [=](){
        std::cout << session->GetMessage();
        std::cout << std::this_thread::get_id << std::endl;
        accept();
    }, std::placeholders::_1);
    acceptor.async_accept(session->GetSocket(), readFunc);
    std::cout << std::this_thread::get_id << std::endl;
}


int main() {

    std::thread thread([](){
        accept();
        context.run();
    });
    accept();
    context.run();
    thread.join();
    return 0;
}

Ответы (0 шт):