boost可升级锁和可共享锁
可升级锁和可共享锁比普通的线程锁提供了更多的功能。一般编程的时候我们可以区分是自己的代码是要读数据还是写数据。如果只有部分线程需要写数据,那普通互斥锁可能会降低代码并行的效率。假如两个线程只需要读数据,那么这两个线程也没有办法并行运行。然而实际上,他俩并不会相互影响。
如果我们提供一种方式,允许并行读,禁止并行写,那么就可以解决这个问题。下面介绍几种线程锁
独占锁:与普通互斥锁类似,如果一个线程获取了独占锁,其他的线程均不能获取任何锁(包括独占锁或者其他锁), 如果任何其他线程拥有除独占锁以外的其他锁,试图获取独占锁的线程将被阻塞。需要写数据的线程应该获取独占锁。
共享锁:如果一个线程获取了共享锁,其他的线程则不能再获取独占锁。如果有线程获取了独占锁,那么其他想获取共享锁的线程将被阻塞。只需要读数据的线程应该获取这种锁。
可升级锁:如果一个线程获取了可升级锁,其他线程可以获取共享锁。如果一个线程获取了独占锁,或者是可升级锁,另一个想要获取可升级锁的线程将被阻塞。当一个线程获取了可升级锁,那么当其他线程想要获取一个与之有关的共享锁的时候,它会被确保升级为独占锁。这种特性适用于那种读操作占比高,但是还是会夹杂一些写操作的线程。当一个线程获取了可升级锁,其他线程可以获取共享锁。如果此线程在读取数据之后,又需要修改,当所有共享锁都被释放之后。这个可升级锁会原子性的升级为一个独占锁。之后这个线程可以修改数据,并且能保证在修改的时候没有其他线程修改过此数据。只有一个线程可以获取可升级锁
- 点赞
- 收藏
- 关注作者
评论(0)