0

我有一个现有的 c++ 代码。

    boost::asio::ip::address m_sender_IP_address;




void Udp_comm::start_receive()
{
    //receive UDP message
    m_sock_r.async_receive_from(
        boost::asio::buffer(m_recv_buffer), 
        m_sender_endpoint,
        boost::bind(&Udp_comm::handle_receive, this, boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred)); 
}

void Udp_comm::handle_receive(const boost::system::error_code& error, const std::size_t bytes_transferred)
{
    std::string recvd_message(m_recv_buffer.begin(), m_recv_buffer.begin() + bytes_transferred);
    m_sender_IP_address = m_sender_endpoint.address();//////////wait here
        //continue to listening to future messages
    start_receive();
    process_message(m_sender_IP_addres.to_string(), recvd_message);
}

如何保护 m_sender_IP_address 不被接收到的下一个 UDP 消息覆盖?我想从方法的第 2 行到handle_receive方法的第 1 行锁定对该变量的访问process_message

我也可以在不使用锁的情况下获得类似的东西吗?

4

1 回答 1

0

这里不需要信号量。您可以使用 astrand来确保最多同时调用一次异步处理程序。为此,请为async_receieve_from()回调创建一个包装的处理程序

void Udp_comm::start_receive()
{
    //receive UDP message
    m_sock_r.async_receive_from(
        boost::asio::buffer(m_recv_buffer), 
        m_sender_endpoint,
        m_strand.wrap(
                boost::bind(
                    &Udp_comm::handle_receive,
                    this,
                    boost::asio::placeholders::error,
                    boost::asio::placeholders::bytes_transferred
                )
            )
        );  
}

这里m_strand是 的成员Udp_comm。这样做将保证只有一个线程可以 mutate m_sender_IP_address

于 2013-07-13T15:08:06.587 回答