同步访问以增强async_write

时间:2018-08-16 12:48:36

标签: c++ boost-asio

我正在使用一个C库,该库会提取PDF数据并通过回调向我提供这些数据。使用了两个回调,一个为我提供了作业标头,另一个为我提供了1至50MB块的翻录数据。

然后我要获取这些数据,并通过TCP通过网络将其发送给关心的人。

我正在使用增强async_write通过网络发送该数据。我想同步对async_write的访问,直到完成发送之前的数据块为止。

C回调函数:

void __stdcall HeaderCallback( void* data, int count )
{
    // The Send function is a member of my AsyncTcpClient class.
    // This is how I'm currently providing my API with the PDF data.
    client.Send( data, count );
}

void __stdcall DataCallback( void* data, int count )
{
    client.Send( data, count );
}

我在AsyncTcpClient类的Send方法中收到了提供的数据。

void AsyncTcpClient::Send( void* buffer, size_t length )
    {
        // Write to the remote server.
        boost::asio::async_write( _session->socket,
            boost::asio::buffer( ( const char* )buffer, length ),
            [ this ]( boost::system::error_code const& error, std::size_t bytesTransfered )
        {
            if ( error )
            {
                _session->errorCode = error;
                OnRequestComplete( _session );
                return;
            }
            std::unique_lock<std::mutex> cancelLock( _session->cancelGuard );
            if ( _session->cancelled )
            {
                OnRequestComplete( _session );
                return;
            }               
        } );
    }

如何同步对async_write函数的访问? 在mutex函数的开头使用Send是毫无意义的,因为async_write立即返回。 将mutex存储在一个unique_lock成员变量中,并试图在async_write回调lambda中对其进行解锁也毫无意义。

如何在不使用async_write的情况下同步对strand函数的访问? 该程序的第一次迭代将不会使用strand进行同步,我将在以后实现。

1 个答案:

答案 0 :(得分:1)

您应该使用io_context::strand

One example和其他许多人,但that answer将为您提供帮助。