一.主调线程的线程私有数据
主调线程不是固定的,可以是业务自己创建的线程,或者是服务端的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的管理类
........................