bthread源码分析(一)概述

本文深入分析bthread,一个M:N线程库,对比其与协程的区别,探讨为何要阅读bthread源码,包括理解系统库原理、深化无锁编程应用和学习编程习惯。文章介绍了bthread的源码结构、阅读难度及推荐的阅读顺序,帮助读者更好地理解和使用bthread。
摘要由CSDN通过智能技术生成

bthread是一个M:N线程库,是brpc的核心组件。bthread实现了用户态上下文切换,主要有2个目标,一是降低编码难度,业务层可使用同步编程模式;二是在多核系统上取得更好的扩展性和局部性,提供更低的延时,更高的cpu利用率。

bthread和协程

谈到bthread,就不得不提协程。首先要强调的一点是,bthread不是协程。一般上我们说的协程的概念是M:1线程库,多个协程跑在一个底层pthread上,一个协程阻塞就会导致协程所在的pthread阻塞,进而该pthread上的其他协程都无法被调度执行。因此协程中不能执行长时间阻塞操作,只能搭配异步I/O,典型的使用场景是http server,这也是golang这种对协程支持较好的语言作为web server开发语言选型越来越流行的一个因素。brpc常用于大规模在线服务的后端server,特点是任务执行时间不确定,常出现少量任务延迟高的情况,在协程模型下就会导致卡住进程造成糟糕的性能表现。与协程最大的区别是,一个bthread被卡住不会影响其他bthread调度,原因是bthread基于butex实现了一套同步机制,这个在后文针对butex的源码分析中会做详细解剖。

为什么要读bthread源码

1、加深对系统库乃至底层操作系统原理的理解,知其然更知其所以然。

正如多数开发者都有使用pthread库的经历,然而对pthread内部实现细节有深入了解的却寥寥无几,brpc的开发者往往没有对bthread内部实现细节进行深挖。诚然对于现代软件体量膨胀的现状不可能要求开发者对自己程序中使用的所有组件内部实现都了如指掌,然而底层系统或者lib中有很多设计理念和实现细节值得深挖,一方面遇到一些疑难杂症时可以做到有的放矢不至于两眼抓瞎,另一方面计算机系统很多

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Qt 中可以使用信号槽机制来实现线程间的通信。 具体实现步骤如下: 1. 定义一个继承自 QThread 的线程类 BThread,重写其 run() 方法,该方法中可以通过调用 wait() 函数来等待 A 线程发出信号。 ``` class BThread : public QThread { Q_OBJECT public: void run() override { // 等待 A 线程发出信号 wait(); // 执行 B 线程的后续代码 // ... } signals: void startSignal(); }; ``` 2. 在 A 线程中创建一个 BThread 类的实例,然后连接 BThread 实例的 startSignal() 信号和 A 线程的槽函数,当 A 线程发出该信号时,B 线程就可以开始执行后续代码。 ``` class AThread : public QThread { public: void run() override { // 创建 B 线程的实例 BThread bThread; // 连接 startSignal() 信号和槽函数 connect(&bThread, &BThread::startSignal, this, [](){ // 发出信号,通知 B 线程开始执行 emit startSignal(); }); // 启动 B 线程 bThread.start(); // ... } signals: void startSignal(); }; ``` 3. 在 B 线程中等待 A 线程发出信号的函数中,使用 QWaitCondition 类来进行等待,当 A 线程调用 startSignal() 信号时,可以通过调用 QWaitCondition 类的 wakeAll() 函数来唤醒 B 线程继续执行后续代码。 ``` class BThread : public QThread { Q_OBJECT public: void run() override { QMutex mutex; QWaitCondition waitCondition; mutex.lock(); // 等待 A 线程发出信号 waitCondition.wait(&mutex); mutex.unlock(); // 执行 B 线程的后续代码 // ... } signals: void startSignal(); }; ``` 通过以上步骤,就可以在 A 线程启动 B 线程后,通过信号槽机制实现 A 线程给 B 线程发送信号,让 B 线程继续执行后续代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值