brpc源码学习(一)-butex

article/2025/8/29 17:31:31

由于brpc中引入了bthread,如果在bthread中使用了mutex,那么将会挂起当前pthread,导致该bthread_worker无法执行其他bthread,因此类似pthread和futex的关系,brpc引入butex来实现bthread粒度的挂起和唤醒。

首先看下butex中使用到的FastPthreadMutex,FastPthreadMutex是基于futex实现的pthread粒度的锁,当竞争不激烈时,lock和unlock操作都是通过修改一个用户态的atomic来实现,只有当竞争激烈的时候才会陷入内核进行挂起和wake。不过互斥锁也是这么实现的,不是太理解重新实现一个的目的…

如果开启了BTHREAD_USE_FAST_PTHREAD_MUTEX宏定义,使用的是FastPthreadMutex,否则使用pthread_mutex_t。
首先看下lock方法
在这里插入图片描述
首先尝试修改locked这个atomic,如果发现锁没被占用,那么直接返回,否则调用lock_contended方法。注意这里使用了memory_order_acquire的memory order,和lock中的release形成syncwith关系,保证了当前线程获得锁之后能看到上个线程在释放锁之前对内存的修改。
在这里插入图片描述
当发现当前锁被占用时,通过系统调用futex_wait_private将当前线程挂起到whole这个atomic对应的队列中。
在这里插入图片描述
unlock方法通过futex_wake_private唤醒whole对应队列中的一个pthread,如上所述,这里使用release保证当前线程对内存的修改能被后续竞争到锁的线程看到。

然后看下butex,butex的实现类似futex。其中ButexWaiterList是一个链表,保存了在该butex上挂起的bthread或pthread。
waiter_lock即上述的锁。因为butex_wait时会比较atomic是否为expect_value,如果相等,那么将会挂起当前bthread至等待队列。如果判断是否相等和挂起这两个操作不在同一个临界区,那么有可能在判断之后但是挂起前已经执行过了butex_wake,将出现信号丢失问题,因此这里需要使用互斥锁。
在这里插入图片描述
然后看下butex_wait的过程
在这里插入图片描述
如果当前线程不是bthread_worker,那么直接调用butex_wait_from_pthread。
如果当前是bthread,那么直接在该bthread栈上创建ButexBthreadWaiter

在这里插入图片描述
然后设置remain,即pthread执行下一个bthread之前需要做的事情,设置完成后切到其他bthread上继续执行。664行为当前bthread恢复后开始执行的地方。然后看下remain,即wait_for_butex中做的工作。
在这里插入图片描述
首先在临界区中再次判断下expect_value是否等于butex中的value,如果相等,才把该waiter加入到butex的等待队列中;如果不相等,则将waiter重新加入到rq中等待调度。
在这里插入图片描述
然后是butex_wake的过程。
在该butex的等待队列中唤醒第一个ButexWaiter front,如果front是pthread,那么调用wakeup_pthread;
然后如果当前pthread是bthread_worker,那么直接让出当前bthread,直接执行被唤醒的bthread,如果当前pthread不是bthread_worker,那么就把当前bthread加入到某个task_group的remote_rq中。


http://chatgpt.dhexx.cn/article/4DLXRLed.shtml

相关文章

brpc-client

ChannelOptions: connect_timeout_ms:连接超时时间; timeout_ms:rpc超时时间,会起个定时器,通过controler::Failed方法获知; max_retry:重试次数;(最终会结…

Brpc代码分析-Server端(九)

2021SCSDUSC 回到CallMethod函数。 接下来将设置各种成员,如超时时间,response等,因为demo中场景没有设置loadbalancer,所以是SingleServer 通过_serialize_request,这里会把request序列化到controller的request_buf&…

又一国产开源项目走向世界,百度RPC框架Apache bRPC正式成为ASF顶级项目

2023 年 1 月 26 日,Apache 软件基金会 (ASF) 官方正式宣布Apache bRPC 正式毕业,成为 Apache的顶级项目。 我听到这个消息是挺开心的,毕竟是又一款由国人主导的apche顶级项目,再次证明国内在开源界正在发挥越来越重要的作用。 …

brpc源码学习(二)-bthread的创建与切换

brpc引入m:n的线程模型,固定的内核线程调度运行大量的bthread以避免内核线程上下文切换带来的开销。 bthread类似协程,即用户态线程,bthread的切换不会陷入内核,不会进行一系列内存同步等耗时操作,因此bthread的切换在…

brpc搭建、编译和使用

前面介绍了brpc的理解,这里给出brpc官方的搭建过程,以及提供的测试用例,对brpc的使用有一个宏观的理解。 PS:这里必须再次称赞百度工程师门,brpc开源的文档非常的丰富,仅仅是看文档都受益匪浅,…

初探brpc

今天开始对百度的这块开源项目进行学习,之前一直有听说,但是没有去尝试使用,下面就自己对brpc的学习心得进行一个总结。 1、brpc的简介 brpc又称为baidu-rpc,是百度开发一款“远过程调用”网络框架。目前该项目已在github上开源…

高性能RPC框架BRPC核心机制分析

作者:tom-sun 链接:https://zhuanlan.zhihu.com/p/113427004 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 1. 简介 百度开源的RPC框架BRPC,以其高性能、低延迟、易用性等优势…

brpc internal

brpc 内部实现 thread model pthread 1:1atomic cache同步降低性能 fiber n:1 -> nginx 多核难以扩展, 用户不能做阻塞操作. context 存储contextualStack bthread_make_fcontext (boost::context)手动切换线程上下文->函数栈, 寄存器 bthread_jump_fcontext 将con…

brpc学习:bvar

一.介绍 bvar是多线程环境下的计数器类库,方便记录和查看用户程序中的各类数值,它利用了thread local存储减少了cache bouncing,相比UbMonitor(百度内的老计数器库)几乎不会给程序增加性能开销,也快于竞争频繁的原子操作。 brpc…

c++ http服务器之Apache工具ab压力测试(nginx与brpc)

系列服务器开发 文章目录 系列服务器开发前言一、ab是什么?二、ab测试实例nginx1.nginx环境准备与安装2.ab测试nginx本身的性能3.ab测试基于brpc的http服务器性能 三、ab实战之常见问题解决总结 前言 一、ab是什么? ab全称为:apache bench&a…

brpc源码学习(五)-IOBuf

目录 Block BlockRef IOBuf 主要api tls优化 IOPortal protobuf接口 首先放上官方介绍: brpc使用butil::IOBuf作为一些协议中的附件或http body的数据结构,它是一种非连续零拷贝缓冲,在其他项目中得到了验证并有出色的性能。IOBuf的接…

BRPC学习

一 源码地址:GitHub - apache/incubator-brpc: brpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. "brpc"…

brpc源码解析(四)—— Bthread机制

目录 一、概述二、启动入口函数三、内部启动函数四、worker工作入口五、总结 Bthread是brpc用到的一个线程库,也是brpc的核心之一,默认情况下,包括用户代码在内的绝大部分代码都是运行在bthread里的,bthread也是brpc实现高性能的基…

Springboot集成Brpc

本文代码可在总结处自取。 1、为什么要写这篇文章 最近自己做的业务在和C团队对接,双方需要指定接口与传输协议。原本是直接使用http协议传输json数据,对双方来说都比较简单可接受。但是json数据传输效率实在令人堪忧,导致我们不得不另寻其道…

brpc源码学习(六)- brpc server 端整体流程

brpc的使用比较容易上手,以官方demo为例,因为brpc的数据序列化依赖protobuf,所以首先需要定义个proto 然后继承EchoService并实现Echo方法 然后是整体流程 启动还是比较简单的,定义server,AddService,然后S…

brpc源码解析(一)—— rpc服务添加以及服务器启动主要过程

目录 1.往Server里添加Service(业务代码)2.设置服务器参数3.启动服务器 平时的工作用到了baidu-rpc搭建rpc服务,作为戈君大神的大作,在没有开源的时候,这个c 的rpc框架在厂内就已经好评颇多,无论是性能、文…

brpc初步学习

一.BRPC介绍 BRPC百度开源的一个rpc框架,它具有以下特性: 基于protobuf接口的RPC框架,也提供json等其他数据格式的支持囊括baidu内部所有RPC协议,支持多种第三方协议模块化设计,层次清晰,很容易添加自定义…

brpc介绍、编译与使用

brpc又称为baidu-rpc,是百度开发一款“远程过程调用”网络框架。目前该项目已在github上开源——https://github.com/brpc/brpc。(转载请指明出于breaksoftware的csdn博客) 据目前公开的资料,我们发现百度内部从2010年开始&#x…

NB-IOT与物联网

1. 物联网的技术格局 短距离(智能家居/穿戴等) --- zigbee, wifi, BLE 长距离 (LPWA 低功耗广域) --- LORA, NB-IOT 关于LORA大致了解了一下情况 . Lora 其实已经是一个很成熟的技术方案. 国外已经大范围使用,国内也有不少公司在基于LORA运营物联网系统. LORA的系统结构…

lora和nbiot的相同点,它们之间有何区别和联系?

在物联网无线数据传输中,有诸多方式可以选择,包括蓝牙、WIFI、FSK、ASK/OOK、Lora、Zigbee、NB-iot、Z-Wave.等, 其中lora 和NBIot 是自2016年来比较热门的两个无线通讯方式。 我们今天就和大家简单的聊聊Lora 和NBiot。 我是在2016年接触…