Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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++ 同步对boost异步写入的访问_C++_Boost Asio - Fatal编程技术网

C++ 同步对boost异步写入的访问

C++ 同步对boost异步写入的访问,c++,boost-asio,C++,Boost Asio,我使用的是一个C库,它可以剥离PDF数据,并通过回调向我提供这些数据。使用了两个回调,一个为我提供作业头,另一个为我提供从1到50MB的数据块 然后,我将获取这些数据,并通过TCP通过网络发送给关心这些数据的人 我正在使用boostasync\u write通过网络发送数据。我想同步对异步写入的访问,直到它发送完前一个数据块 C回调函数: void __stdcall HeaderCallback( void* data, int count ) { // The Send functi

我使用的是一个
C
库,它可以剥离PDF数据,并通过回调向我提供这些数据。使用了两个回调,一个为我提供作业头,另一个为我提供从1到50MB的数据块

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

我正在使用boost
async\u 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;
            }               
        } );
    }
void AsyncTcpClient::Send(void*缓冲区,大小\u t长度)
{
//写入远程服务器。
boost::asio::异步写入(\u会话->套接字,
boost::asio::buffer((const char*)buffer,长度),
[this](boost::system::error\u code const&error,std::size\u t bytesttransfer)
{
如果(错误)
{
_会话->错误代码=错误;
OnRequestComplete(_会话);
返回;
}
std::unique_lock cancelLock(_session->cancelGuard);
如果(会话->取消)
{
OnRequestComplete(_会话);
返回;
}               
} );
}
如何同步对
async\u write
函数的访问? 在
Send
函数的开头使用
mutex
将毫无意义,因为
async\u write
会立即返回。 将
互斥锁
存储在
唯一锁定
成员变量中并尝试在
异步写入
回调lambda中解锁它也是毫无意义的,因为这样会爆炸

如果不使用
,如何同步对
异步写入
功能的访问? 程序的第一次迭代不会使用
进行同步,我将在稍后实现它。

您应该使用一个


来自许多其他人,但会帮助您。

缓冲数据,如果还没有一个活动的数据,则调用async_write。在async_write的处理程序中,检查是否有更多缓冲数据,如果有,请再次调用async_write。如果涉及到多个线程,则需要添加一些同步。是的,我最终使用了
串。