mutex trên boost :: asio :: write not works

Sep 28 2020

Tôi đang cố tạo một ứng dụng khách tcp không đồng bộ (nó sẽ không đợi kết quả của một yêu cầu trước khi gửi một yêu cầu khác).

Phương thức yêu cầu trông giống như:

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.

viết phương thức gọi boost :: asio :: viết như thế này:

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);
}

Nhưng có vẻ như vẫn có nhiều luồng ghi đồng thời như những gì tôi nhận được trong máy chủ như sau:

{"Khóa": "Val {" Khóa ": Giá trị}; ue"};

Tôi nên làm gì?

Trả lời

3 Jeffrey Sep 28 2020 at 20:05

Bạn đã đặt khóa bảo vệ xung quanh việc ghi vào asio . Như bạn có thể thấy, không có gì đảm bảo rằng đầu bên kia sẽ xử lý chúng với cùng một người bảo vệ.

Bạn nên đặt người bảo vệ ở nơi bạn cần, khi viết json , ra khỏi 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.