Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c+中,扩展现有数据结构以包含信号量或类似方法的最简单方法是什么+;? 我有一个现有的C++代码。_C++_Boost_Mutex_Semaphore - Fatal编程技术网

在c+中,扩展现有数据结构以包含信号量或类似方法的最简单方法是什么+;? 我有一个现有的C++代码。

在c+中,扩展现有数据结构以包含信号量或类似方法的最简单方法是什么+;? 我有一个现有的C++代码。,c++,boost,mutex,semaphore,C++,Boost,Mutex,Semaphore,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::h

    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_发送者_IP_地址不被接收到的下一个UDP消息覆盖?我想从
handle\u receive
方法的第2行到
process\u message
方法的第1行锁定对该变量的访问


我也可以在不使用锁的情况下实现类似的功能吗?

这里不需要信号量。您可以使用
来确保异步处理程序最多并发调用一次。为此,请为
async\u receive\u 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
的成员。这样做将保证只有一个线程可以变异
m\u发送方\u IP\u地址

可能有用。