我们知道在linux 下,锁和其他一些同步机制都会用到futex,futex诞生后扮演着非常重要的角色,可以说futex是linux底层最重要的同步手段之一,无论是pthread_mutex还是semaphore都用到了futex,bthread作为基于pthread实现的一套线程库,自然也需要类似的线程同步机制,用于在bhtread上进行阻塞同步,因此就有了类futex的butex,这篇文章就来聊聊butex的实现。
一、futex简介
在介绍butex之前我们首先来简单看下futex,网上关于futex的介绍有很多,这里只是简单介绍下用于引出本文的主题butex,想更深入地学习可以看看2篇参考文章,写得很不错。
futex是一个高效的同步组件,futex由一个内核态的队列和一个用户态的integer构成,有竞争时会放到等待队列供后面唤醒,整个操作主要用到了自旋锁来保护临界区。基于futex构造锁到时候一个典型的模式是先通过对一个原子变量进行cas操作尝试直接获取锁,如果没竞争直接返回,有竞争调用futex_wait。
简单来说,futex主要包括等待和唤醒两个方法:futex_wait和futex_wake,简化后的定义如下:
//uaddr指向一个地址,val代表这个地址期待的值,当*uaddr==val时,才会进行wait
int futex_wait(int *uaddr, int val);
//唤醒n个在uaddr指向的锁变量上挂起等待的进程
int futex_wake(int *uaddr, int n);
这里贴一下参考文章对两个流程的总结:
(1)futex_wait:
- 加自旋锁
- 检测*uaddr是否等于val,如果不相等则会立即返回
- 将进程状态设置为TASK_INTERRUPTIBLE
- 将当期进程插入到等待队列中
- 释放自旋锁
- 创建定时任务:当超过一定时间

本文深入探讨Linux下的futex机制及其在bthread中的实现——butex。futex是一个高效的用户态和内核态交互的同步组件,主要包含futex_wait和futex_wake两个关键函数。在bthread中,butex类似futex,但更上层,支持用户态线程同步。butex_wait和butex_wake是其核心,涉及等待队列、超时管理和线程唤醒。通过butex_wait和butex_wake的源码解析,展示了bthread如何利用butex实现高效同步。
—— bthread上的类futex同步组件butex详解&spm=1001.2101.3001.5002&articleId=113068231&d=1&t=3&u=040f7d1c89784f88a02d76cdc8882ca6)
1万+

被折叠的 条评论
为什么被折叠?



