概述
1. 读写锁
读写锁与互斥量类似,但是读写锁允许更高的并行性。互斥量要么是锁住多个要么是未锁住状态,而且一次只有一个线程可以对其加锁。读写锁可以有三种状态:读模式写加锁状态,写模式写加锁状态,不加锁状态。一次只有一个线程可以占有写模式下的读写锁,但是多个线程可以同时占有读模式下的读写锁。读写锁也叫做共享-独占锁,读写锁以读模式锁住时它是以共享锁锁住的,以写模式锁住时,以独占的模式锁住的。
通俗的来理解,可以多个线程来进行读操作,但是写只能一个写。
相关操作函数
头文件< pthread.h>
锁初始化:
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr)
读模式下锁定读写锁:
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)
写模式下锁定读写锁:
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock)
解锁操作:
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
有条件的读写锁
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock)
上述函数成功的返回值都是0,读写锁的优点在于读操作远远大于写操作。
2. 自旋锁
自旋锁与互斥锁类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,”自旋”一词就是因此而得名。由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。
信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用(_trylock的变种能够在中断上下文使用),而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共巷资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。
自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。
跟互斥锁一样,一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。
无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个线程执行相关操作。
最后
以上就是粗犷裙子为你收集整理的自旋锁与读写锁的全部内容,希望文章能够帮你解决自旋锁与读写锁所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复