I have the following two member functions in a class. The _mtxWrite is a mutex object I use to make the write function thread safe. During heavy load, sometimes the writeHandler doesn't get called. Then _mtxWrite doesn't get released, resulting in a deadlock. What is the best way detect the situation and resolve the deadlock?
template <class TSession>
void write(boost::shared_ptr<TSession> pSession,
boost::shared_ptr<CInProtocolBase> pMessage)
{
std::vector<unsigned char>* pData = new std::vector<unsigned char>;
pMessage->serialize(*pData);
_mtxWrite.lock();
boost::asio::async_write(_socket,boost::asio::buffer(&pData->at(0),
pData->size()),
boost::bind(&this_type::writeHandler<TSession>,
shared_from_this(),pSession,pData,boost::asio::placeholders::error));
}
template <class TSession>
void writeHandler(boost::shared_ptr<TSession> pSession,
std::vector<unsigned char>* pData,const boost::system::error_code& ec)
{
delete pData;
_mtxWrite.unlock();
if(ec)
{
_socket.get_io_service().post(boost::bind(&TSession::errorHandler,
pSession,ec));
}
}