futex (fast userspace mutex),快速体现在,现在优先在应用层用原子操作获取锁,没获取到再陷入内核休眠挂起。不同于内核mutex用底bit做flag,pthread mutex用高2bit做flag,低位保存的是thread id,一个flag是owner died,锁拥有者狗带了,内核的锁持有者是不能被干掉的,这里是可以的,一个flag是waiters告诉大家有人等着拿锁。陷入内核之后,休眠之前,再确认下变量有没没变化,有变化说明锁主易主,回去再看看吧,没变化就睡下吧。然后就是内核里面,它是用的优先级链表构建出来的桶来管理系统所有的futex的,优先级链表是按照线程优先级排序的。lock的状态原子操作都在应用层,内核只管挂起和唤醒的操作,这是普通锁常规情况,有人狗带另说,狗带退出的时候内核会调用函数去判断状态机来修改owner died flag。
除了常规的,还有pi类型,优先级继承,底层直接用了rt mutex,然后是requeue对应条件变量场景,直接把等待线程从一个futex转移到另外一个futex,与 lock; while(flag ){wait} unlock;的wait相对应,从cond 的futex requeue 到mutex的futex。
386

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



