美文网首页
同步机制

同步机制

作者: 修塔寻千里 | 来源:发表于2020-01-29 14:59 被阅读0次

    经典实现

    信号量

    信号量与PV原语操作由Dijkstra发明,也是使用最广泛的互斥方法之一。它包含以下几个元素:

    • Semaphore S(信号量)
    • Operation P,有时也表达为wait()
    • Operation V, 有时也表达为signal()
      Semaphore S用于指示共享资源的可用数量,P原语可以减小S计数,V则增加它的计数。由此可知当某个进程想进入共享区,首先要执行P操作;同理,想退出共享区时执行V操作。


      PV操作图

    Mutex

    Mutual Exclusion,其释义为互斥体。Mutex通常是对某一排他资源的共享控制——要么这个资源被占用(Lock),要么就是可以访问(unlock)。

    管程(Monitor)

    管程是可以被多个线程/进程安全访问的对象(Object)或者模块(module)。管程中的方法都是受mutual exclusion保护的,意味着着同一时刻只允许一个访问者使用它们。另外管程还具备如下属性:

    • 安全性
    • 互斥性
    • 共享性

    Android中的同步机制

    Mutex

    Android中的Mutex只是对pthread提供的API的简单再封装,另外Mutex中还包含一个AutoLock的嵌套类,它利用变量生命周期特点而设计的一个辅助类。
    Mutex既可以实现进程内的永不,也可以解决进程间同步问题。与Semaphore不同,Mutex只有两种状态,即0和1。当调用者希望访问临界资源时,它必须先通过lock()来获取资源锁。如果此时资源可用,这个函数立马返回;否则,会进入阻塞等待,知道有人释放了资源锁并唤醒它。释放资源锁调用unlock(),同时正在等待使用这个锁的其他对象会被唤醒,然后继续执行它的任务。另外Mutex还特别提供了一个tryLock()来满足程序多样化需求。这个函数会试探性地查询资源锁是否可用,在不可用的情况下,并不会阻塞,而是同样立即返回,只是返回值不为0。

    Condition

    Condition是“条件变量”在Android系统中的实现类,它是依赖Mutex来完成的。

    Barrier

    Barrier是同时基于Mutex和Condition实现的一个模型。是对Condition的一个应用,Barrier类是专门为SurfaceFlinger而设计的。

    加解锁的自动化操作——Autolock

    在Mutex类内部的Autolock嵌套类,实现了加、解锁的自动化操作。它的实现原理为:
    当Autolock构造时,会主动调用内部成员变量mLock的lock()方法来获取一个锁。而在析构时,调用它的unlock()方法释放锁。这样假如一个Autolock对象是局部变量的话,那么它在生命周期结束时就会自动把资源解锁。

    参考资料

    • 深入理解Android内核设计思想. 林学森。

    相关文章

      网友评论

          本文标题:同步机制

          本文链接:https://www.haomeiwen.com/subject/syivthtx.html