std::vector<bthread_t> bids;
for (int i = 0; i < FLAGS_thread_num; ++i) {
if (bthread_start_background(&bids[i], NULL, myfunc, &myarg) != 0) {
LOG(ERROR) << "Fail to create bthread";
return -1;
}
}
for (int i = 0; i < FLAGS_thread_num; ++i) {
bthread_join(bids[i], NULL);
}
bthread是brpc使用的M:N线程库,M个bthread会映射至N个pthread。
在我们调用一次bthread_start_background / bthread_start_urgent会依次触发TaskControl和TaskGroup的相应接口。bthread主要的类有两个TaskControl和TaskGroup,下面就来探究下TaskControl和TaskGroup如何实现M:N的线程模型。
首先Task Control使用单例模式。
get_or_new_task_control 获取到Task Control实例,并且确保了唯一Task Control的实例,在改函数中该实例严格的生成用atomic保证,并且使用内存memory_order_consume保证了代码顺序不被编译器优化,确保了在多线程环境下的执行顺序。
TaskControl采用单例模式,对TaskGroup进行管理。
那么Task Control管理了什么?以下图示是task control的接口:
接口主要分为两大类:一类是创建并管理TaskGroup,一类是统计TaskGroup相关的数据:
备份二级队列, 向队列中提交不在btrhead中创建的任务
TaskGroup::run_main_task() 这个是TaskGroup的main入口。
while(Wait_task()) {
//按照顺序先从自身的run_queue,然后去remote_queue找任务执行,或者steal的方式调度任务
TaskGroup::sched_to(&dummy,tid);
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有