代码之家  ›  专栏  ›  技术社区  ›  WBuck

关于boost::strand中执行的操作的说明

  •  0
  • WBuck  · 技术社区  · 6 年前

    我有个问题,关于什么是,什么不是 strand . 我已经读过关于这个的文章,以及 搁浅

    下面这个班是 tcp

    我也想提一下 io_service::run 被多次传唤 threads .

    int main( )
    { 
        /* Other stuff */
        client.WriteAsync( buffer1 ); 
        client.WriteAsync( buffer2 );
    }
    
    
    /* TcpClient class */
    
    void TcpClient::WriteAsync( std::shared_ptr<boost::asio::streambuf> buffer )
    {
        // 1
        _strand.post( [ this, buffer ]( ) 
        {
            _outbuffer.push( buffer );
            if ( _outbuffer.size( ) > 1 ) return;
            // 2
            Write( );
        } );
    }
    
    void TcpClient::Write( )
    {       
        // 3
        boost::asio::async_write( _socket,
            *_outbuffer.front( ),
            // 4
            [ this ]( boost::system::error_code const& error,
                size_t const bytesTransferred )
        {               
            _outbuffer.pop( );          
            if ( error )
            {
                std::cout << "Error writing: " << error.message( ) << std::endl;
            }
            if ( !_outbuffer.empty( ) )
            {
                // 5
                Write( );
            }
        } );
    }
    

    _strand.post 如果当前没有运行 搁浅 将分派传入的处理程序。在这种情况下 lambda 传送到钢绞线将在钢绞线中执行。如果已完成工作,则处理程序将排队。

    二: Write ,当从 传递给 post 正在运行 搁浅

    三: async_write 搁浅 异步写入 搁浅

    四: 这个 完成处理程序是 . 当 异步写入 搁浅

    5个: 从内部调用 完成处理程序和is 搁浅

    1 回复  |  直到 6 年前
        1
  •  1
  •   Shane Powell    6 年前

    1: _strand.post被调用,如果当前没有任何东西在运行,则该strand将分派传入的处理程序。在这种情况下,传递给链的lambda将在链中执行。如果已完成工作,则处理程序将排队。

    对的。

    对的。

    不正确。当传递给链的lambda“返回”时,将运行下一个排队的链工作位。

    4: 异步写入完成处理程序未在链中运行。

    当异步写入完成处理程序被调用时,链将弹出其队列的下一个工作单元并将其分派。

    同样,当传递给串的lambda“返回”下一个排队的串工作位时,也是不正确的。

    5: Write是从异步写入完成处理程序内调用的,它不在字符串中运行

    对的。

    bind_executor .

    void TcpClient::Write( )
    {       
        boost::asio::async_write( _socket,
            *_outbuffer.front( ),
            // here
            boost::asio::bind_executor(_strand, [ this ]( boost::system::error_code const& error, size_t const bytesTransferred )
        {               
            _outbuffer.pop( );          
            if ( error )
            {
                std::cout << "Error writing: " << error.message( ) << std::endl;
            }
            if ( !_outbuffer.empty( ) )
            {
                // 5
                Write( );
            }
        } ));
    }