我正在使用一个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
进行同步,我将在以后实现。