Mutex类使用Futex实现同步
来源:互联网 发布:java工程师培训有用吗 编辑:程序博客网 时间:2024/05/21 14:06
新书上市《深入解析Android 5.0系统》
以下内容节选自本书
下面我们将通过一个实际的例子来进一步的了解Futex的用法。前面我们介绍Bionic中的线程管理时介绍了pthread的临界区函数。临界区的实现中最重要的是上锁和解锁函数,下面我们看看它们的实现:
1.
static__inline__ void _normal_lock(pthread_mutex_t*
{
const int locked_uncontended = shared |MUTEX_STATE_BITS_LOCKED_UNCONTENDED;
}
_normal_lock()函数调用原子操作函数__bionic_cmpxchg()来检测mutex->value的值是否等于unlocked变量的值(unlocked代表未锁定的状态),如果相等则将mutex->value的值设置为locked_uncontended变量的值(表示锁定但是没有竞争的状态)。__bionic_cmpxchg()函数在mutex->value不等于unlocked的情况下会返回非0,这样就进入if语句内执行。
__bionic_swap()函数会将mutex->value的值设为locked_contended(表示有竞争),同时返回mutex->value原来的值。如果mutex->value原来的值不等于unlocked则调用函数__futex_wait_ex()挂起线程等待。这里使用while循环是因为可能有多个线程在等待,即使从挂起状态恢复后也可能还是抢不到锁,所以要重新进入等待状态。
2.
static__inline__ void _normal_unlock(pthread_mutex_t*
{
if (__bionic_atomic_dec(&mutex->value)!=
}
解锁时首先使用__bionic_atomic_dec()函数对mutex->value执行减一操作,函数__bionic_atomic_dec()将返回mutex->value原来的值。如果mutex->value原来的值不是“锁定但是无竞争”的状态,也就意味着还有线程在等待,所以要调用__futex_wake_ex()来唤醒等待的线程。
从Mutex的实现代码中我们应该能体会到Futex的优点,如果多个线程访问临界区的时间是错开的,也就是没有真正的竞争发生,那么实际上是不会产生系统调用的。
当然如果多个线程在竞争临界区的锁,还是一样会有挂起和唤醒的系统调用。这种情况下Futex的效率和以前的实现就没有区别了。- Mutex类使用Futex实现同步
- Futex同步机制
- Futex同步机制简介
- Android同步类:Mutex和Condition的使用方式
- Linux进程同步机制-Futex
- Linux进程同步机制-Futex
- Linux中的同步机制 -- Futex
- Linux中的同步机制 -- Futex
- Linux中的同步机制 -- Futex
- Linux中的同步机制 -- Futex
- Linux进程同步机制Futex
- futex的使用
- 线程同步技术二:Mutex的使用
- 线程同步之互斥量mutex的使用
- 线程同步之互斥量mutex的使用
- Java多线程同步设计中使用Mutex
- 使用互斥对象(Mutex)实现不同进程间线程同步
- windows下使用Critical Section和Mutex实现线程同步实例
- Android build系统中常用LOCAL_变量
- oracle 备份与恢复系列笔记-1
- Futex同步机制简介
- Android的Futex系统调用
- Futex用户态操作
- Mutex类使用Futex实现同步
- 虚拟运营商会如何卖手机?且看JDPhone和余额宝
- Android资源匹配算法
- C语言基础学习小总结
- Android图片资源的缩放问题
- SEAndroid简介
- SEAndroid的各种策略文件
- Init进程设置SELinux的Policy
- Init进程初始化安全上下文