声明:本文代码均为 C++ 伪代码,仅用于表示含义,出于描述简单,语法使用 C++11。
最近在接手的工作中发现了一段有点问题的代码,功能上大致是要实现这样的目标:客户端发送一个请求,然后在当前线程内等待服务器的响应,但由于底层使用的网络库是异步 Reactor 模式的,需要进行一个基本的同步操作来实现发送线程内接收响应。以伪代码的形式表现大概如下:
struct Packet {};
class Synchronizer {};
void SendRequest(Packet *_req)
{
unsigned int threadId = ::GetCurrentThreadId();
_req->threadId = threadId;
network->SendData(target, _req);
Synchronizer::GetInstance()->RegisterThread(threadId);
Packet *res = Synchronizer::GetInstance()->WaitThreadData(threadId);
}
显然,WaitThreadData 的操作不能因为收不到对端响应就一直阻塞 ...