mutex en boost :: asio :: write no funciona

Sep 28 2020

Estoy tratando de hacer un cliente tcp asíncrono (no esperará el resultado de una solicitud antes de enviar otra solicitud).

Un método de solicitud se ve así:

std::future<void> AsyncClient::SomeRequestMethod(sometype& parameter)
{
    return std::async(
        std::launch::async,
        [&]()
        {
            // Gonna send a json. ';' at the end of a json separates the requests.
            const std::string requestJson = Serializer::ArraySumRequest(numbers) + ';';
            boost::system::error_code err;

            write(requestJson, err);
            // Other stuff.

escribir llamadas al método boost :: asio :: escribir así:

void AsyncClient::write(const std::string& strToWrite, boost::system::error_code& err)
{
    // m_writeMutex is a class member I use to synchronize writing.
    std::lock_guard<std::mutex> lock(m_writeMutex);
    boost::asio::write(m_socket,
        boost::asio::buffer(strToWrite), err);
}

Pero parece que aún se escriben varios subprocesos al mismo tiempo, ya que lo que recibo en el servidor es como:

{"Clave": "Val {" Clave ": Valor}; ue"};

¿Qué tengo que hacer?

Respuestas

3 Jeffrey Sep 28 2020 at 20:05

Pusiste el guardia de la cerradura alrededor escribiendo al asio . Como puede ver, no hay garantía de que el otro extremo los procese con la misma protección.

Debería poner la guardia donde la necesita, al escribir el json , fuera del asio:

void AsyncClient::write(const std::string& strToWrite, boost::system::error_code& err)
{
    // m_writeMutex is a class member I use to synchronize writing.
//  std::lock_guard<std::mutex> lock(m_writeMutex);
    boost::asio::write(m_socket,
    boost::asio::buffer(strToWrite), err);
}

return std::async(
    std::launch::async,
    [&]()
    {
        std::lock_guard<std::mutex> lock(m_writeMutex); // <--- here

        // Gonna send a json. ';' at the end of a json separates the requests.
        const std::string requestJson = Serializer::ArraySumRequest(numbers) + ';';
        boost::system::error_code err;

        write(requestJson, err);
        // Other stuff.