bthread_id 是一个特殊的同步结构,它可以互斥 RPC 过程中的不同环节,也可以在 O(1) 时间内找到 RPC 上下文(即 Controller)。注意,这里我们谈论的是 bthread_id_t,不是 bthread_t(bthread 的 tid),这个名字起得确实不太好,容易混淆。
要解决什么问题
具体来说,bthread_id 解决的问题在其他 RPC 框架中广泛存在,下面我们来看下 brpc 是如何通过 bthread_id 解决这些问题的。
id 的表示与映射
bthread_id 包括两部分:一个是用户可见的 64 位 id,另一个是对应的不可见的 bthread::Id 结构体,用户接口都是操作 id 的。从 id 映射到结构体的方式和 brpc 中的其他结构类似:32 位是内存池的位移,32 位是 version,前者 O(1) 时间定位,后者防止 ABA 问题。
接口设计
bthread_id 的接口不太简洁,有不少 API,这么多接口是为了满足不同的使用流程。