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
通过网络发送给关心这些数据的人
我正在使用boostasync\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。如果涉及到多个线程,则需要添加一些同步。是的,我最终使用了串。