![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
bthread
文章平均质量分 67
假如子弹换成糖果
目前大部分学习wiki更新在baidu内网wiki中。
展开
-
bthread(一) 前言
前言建议配合代码库看,一切以代码为准:https://github.com/apache/incubator-brpc/tree/master/src/bthread感受bthread为brpc的核心,设计的初衷其实是在充分利用cpu的情况下保证数据的局部性,在设计过程中遇到的各种问题戈大神团队参考了多种linux内核原语进行了重写和实现,其中比较核心的设计为每TaskGroup的_rq无锁队列的设计以及work stealing调度的各种逻辑实现,目的都是在尽可能少加锁的情况下实现线程调度的功原创 2021-04-01 01:35:25 · 427 阅读 · 3 评论 -
bthread(二) 线程模型及bthread
线程模型pthread:1:1,一个内核线程里只有一个用户线程,作为独立的调度单元可以被调度到多个cpu上优点:多核扩展性好,起多个用户线程可以跑在多个cpu上 缺点:多个用户线程之间数据交互,互斥访问增加代码复杂度,即使用原子变量,当用户线程从cpu0切换到cpu1时,data要从L1 cache同步到其他cpu(锁住总线),所以起太多的pthread对于内核调度压力较大协程(改进):n:1,n个用户线程跑在一个内核线程(一个cpu)优点:无多线程竞争,写代码容易些,因为跑在一个cpu上,原创 2021-03-30 01:06:48 · 691 阅读 · 0 评论 -
bthread(三) bthread数据结构
TaskControl base::atomic<size_t> _ngroup; TaskGroup** _groups;// TaskGroup对象指针的数组 base::atomic<int> _concurrency;// TC启动时的默认起的pthread数量,可以理解为bthread并发度数量,静态开关配置为9 std::vector<pthread_t> _workers;/...原创 2021-04-01 01:11:02 · 335 阅读 · 0 评论 -
bthread(四) bthread用户接口和代码执行路径
bthread用户接口bthread_t(类似pthread_t):64位int,前32位版本号防止ABA问题(释放后又重新被分配了,歧义),后32位为资源池(无全局竞争可O(1)访问的数组)中下标,可以很快地找到TaskMeta(里面有个变量就是这个bth的栈)起bth基本函数bthread_start_urgent &bthread_start_background 里面都是先判断g是否为空(是否运行在worker里),是的话运行start_xxx,不是运行start_from_n.原创 2021-04-01 01:19:07 · 765 阅读 · 0 评论 -
bthread(五) 无锁队列rq的代码实现
基本介绍初始化时b=t=1,代表队列为空,load是取值,store是赋值,push是从队尾添加(b+1),pop是从对首弹出(正常是b-1,有竞争了t+1),steal是从对首偷(t+1)。所以,b=t时队列为空,b=t+1时队列有1个元素。竞争情况由于对于此队列的push和pop操作发生在一次流程的两个阶段,所以不会产生竞争,push和steal不需要对一个元素竞争那么竞争就发生在pop和steal以及steal和steal中。比如:当前只有一个bth在队列里,tg1想从rq里pop一个,t原创 2021-04-01 01:20:21 · 356 阅读 · 0 评论 -
bthread(六) 小结
brpc内如何用的bthread以epoll为例举例,epoll线程跑在bthread里,io bthread是按需起的(只要有读、写事件来就起一个,对于一个fd只起一个读线程和线程),用户回调也是跑在bthread【Q1】如果在callback里阻塞整个worker,其他worker会偷过来运行,但是万一所有worker都被阻塞住,那就gg了。【Q2】如果在callback里发起brpc,只会阻塞当前bthread,底层的worker不受影响,他发现后就移出rq,这时,这个callback原创 2021-04-01 01:24:49 · 754 阅读 · 0 评论