【中间件】brpc_基础_bthread头文件
bthread.h学习笔记
源码
1 概述
bthread.h 定义了一个用户级线程库,提供类似 POSIX 线程(pthread)的功能,但针对高并发和调度优化进行了扩展。支持线程管理、同步原语、中断机制、线程特定数据等功能,适用于需要高效协程管理的场景。
2 核心功能模块
2.1 线程创建与管理
- 启动模式: - Urgent (bthread_start_urgent):立即切换至新线程,适合高优先级任务。
- Background (bthread_start_background):类似pthread_create,启动后返回,新线程可能延迟执行。
 
- Urgent (
- 线程控制: - bthread_exit:终止当前线程。
- bthread_join:等待线程结束(所有线程默认可连接,但返回值固定为- NULL,需通过参数传递结果)。
- bthread_self:获取当前线程 ID。
- bthread_yield:主动让出 CPU(调度公平性可能不足)。
 
2.2 中断与停止
- 中断机制: - bthread_interrupt:唤醒阻塞中的线程(如- bthread_usleep返回错误,- bthread_cond_wait唤醒)。
- bthread_stop:设置停止标志并中断线程,需线程内部检查- bthread_stopped退出。
 
- 协作式退出:需用户代码主动检查停止标志,避免资源泄漏。
2.3 同步原语
- 互斥锁 (bthread_mutex_*):- 初始化时属性可能被忽略(建议传 NULL)。
- 支持 trylock、timedlock。
 
- 初始化时属性可能被忽略(建议传 
- 条件变量 (bthread_cond_*):- 需与互斥锁配合使用,支持超时等待 (bthread_cond_timedwait)。
 
- 需与互斥锁配合使用,支持超时等待 (
- 读写锁 (bthread_rwlock_*):- 支持读写分离锁,可配置偏好(读优先/写优先)。
 
- 信号量 (bthread_sem_*):- 提供 post_n批量释放信号量。
 
- 提供 
- 屏障 (bthread_barrier_*):- 多线程同步点,等待指定数量的线程到达。
 
2.4 线程特定数据 (TSD)
- key管理: - bthread_key_create/- bthread_key_delete:创建/销毁键。
- bthread_setspecific/- bthread_getspecific:设置/获取线程本地数据。
 
- 性能提示:短生命周期线程慎用 TSD,避免频繁分配键表。
2.5 调度与并发控制
- 并发度调整: - bthread_setconcurrency:设置工作线程(底层 pthread)数量。
- 按标签管理:bthread_setconcurrency_by_tag支持为不同任务类别分配独立并发度。
 
- CPU 时间统计: - bthread_cpu_clock_ns:获取线程 CPU 时间(需启用- bthread_enable_cpu_clock_stat)。
 
2.6 工具函数
- 一次性初始化: - bthread_once:确保初始化代码仅执行一次。
 
- 列表管理: - bthread_list_*:批量管理线程(非线程安全,需外部同步)。
 
3 关键设计特点
-  协作式调度: - bthread_yield和同步原语可能触发线程切换,但调度公平性有限,需避免长耗时操作独占 CPU。
 
-  轻量级中断: - 通过标志位 + 中断唤醒协作退出,避免强制终止导致的资源问题。
 
-  高效同步: - 同步原语可能基于用户态实现,减少内核切换开销(如信号量 post_n批量操作)。
 
- 同步原语可能基于用户态实现,减少内核切换开销(如信号量 
-  标签化并发: - 允许不同任务类型(如计算密集型、I/O 密集型)使用独立并发度,优化资源利用。
 
4 使用注意事项
- 错误处理:函数返回 0表示成功,错误码需通过返回值或errno检查。
- 线程生命周期:短线程慎用 TSD,避免性能损耗。
- 中断兼容性:不同阻塞函数对中断的反应不同(如 bthread_usleep返回ESTOP,而bthread_mutex_lock不受影响)。
- 资源回收:所有线程默认可连接,但需手动调用 bthread_join确保资源释放。
5 示例场景
// 创建高优先级线程并等待
bthread_t tid;
bthread_start_urgent(&tid, NULL, my_func, my_args);
bthread_join(tid, NULL);// 使用条件变量同步
bthread_mutex_lock(&mutex);
while (!condition) {bthread_cond_wait(&cond, &mutex);
}
bthread_mutex_unlock(&mutex);// 中断处理
void* worker(void* arg) {while (!bthread_stopped(bthread_self())) {// 工作逻辑}return NULL;
}
bthread_stop(tid); // 触发退出
6 总结
bthread 提供了高性能的用户级线程管理,适用于需要细粒度并发控制的场景。开发者需结合其协作式调度、中断机制和同步原语特性,合理设计线程逻辑,以充分发挥其优势。
