一.主调线程的线程私有数据
主调线程不是固定的,可以是业务自己创建的线程,或者是服务端的handle线程,甚至是客户端的网络线程(调用框架其他节点的rpc接口),为了能保存rpc调用的上下文,每个主调线程会创建自己的线程私有数据ServantProxyThreadData。在ServantProxy::invoke()里,可以看到获取私有线程数据:
void ServantProxy::invoke(ReqMessage * msg, bool bCoroAsync)
{
msg->proxy = this;
msg->response.iRet = TARSSERVERUNKNOWNERR;
//线程私有数据
ServantProxyThreadData * pSptd = ServantProxyThreadData::getData();
assert(pSptd != NULL);
..........
}
ServantProxyThreadData的主要成员如下:
class ServantProxyThreadData : public TC_ThreadPool::ThreadData
{
public:
static TC_ThreadMutex _mutex; //全局的互斥锁
static pthread_key_t _key; //私有线程数据key
static SeqManager * _pSeq; //生成seq的管理类
........................

本文深入探讨了在tars框架中,主调线程如何通过线程私有数据ServantProxyThreadData与网络线程交互,完成RPC请求的传递。详细阐述了请求队列、序列号分配、网络线程选择算法以及epoll事件触发的处理过程,揭示了内部的通信机制。
最低0.47元/天 解锁文章
964

被折叠的 条评论
为什么被折叠?



