三大同步原语:mutex,semaphore,condition variable。
mutex有以下细节需要注意:
递归:Linux中的mutex分为递归(重入)的和非递归(不可重入)的,即是否允许同一个线程多次获取和释放。
多次获取递归mutex,会嵌套持有,增加锁的计数器,必须使用等量的释放动作才可完全释放锁。
多次获取非递归的mutex,会导致死锁。
semaphore的细节:
限制并发:可以限制同时访问某资源的线程数量,而mutex同时仅允许一个线程访问资源。
场景1:(单方向限制)电影院有100张票,设置初始值为100的semaphore,每次被购买就是用release,直到值为0时不可购买。
场景2:(双向限制上限和下限)使用信号量和有限长队列解决生产者消费者问题,用两个semaphore,一个表示队列剩余元素个数,一个表示队列剩余容量,可以双向控制队列元素数量处于0~max之间。
用途:限制同时访问某资源的线程数(见上)。除此之外,还可用于进程间通信,配合内存映射文件使用,使不同进程使用同一个semaphore,在 POSIX API中,semaphore创建时需要提供一个路径名,这样多个不同的进程使用同一个路径,即可使用同一个semaphore。
在不可抢占内核里,使用一个特殊的RCU线程(syncer),当他被调度到时,即说明所有的读者读完了。
grace period:被删除的元素仍然可读的时期;
新的概念:RLU (read log update)
to be continued