iOS多线程安全,引出各种锁(下)

2022-05-29  本文已影响0人  皮皮他爸

5、NSConditionLock

image.png

NSConditionLock其实就是对NSCondition的又一层封装,添加了依赖条件,这样就可以控制锁的顺序

image.png

6、NSRecursiveLock

image.png

NSRecursiveLock跟NSLock的api一模一样,唯一不同的是上面的NSLock是不能递归的,而NSRecursiveLock是可以递归调用的(可以重复的加锁、解锁)


image.png

看看NSRecursiveLock源码内容:

image.png image.png

一目了然,就是pthread的封装,添加了一个pthread_mutexattr_settype(attrs,type)
设置了一个PTHREAD_MUTEX_RECURSIVE属性。

那递归锁究竟有什么作用呢?

看下面的例子


image.png

如果用NSLock肯定会死锁,线程卡死。只能输出了一次10


image.png

warnning:递归锁也有自己需要注意的情况,就是不同的线程去递归调用同一个递归锁,同样会出现死锁崩溃的情况:

image.png

这个时候小伙伴是不是有点懵逼,锁本来就是处理多线程访问同一块内存防止错乱。递归锁可以被多个线程同时加锁,但是解锁的时候会互相等待导致死锁的情况。

如果需要多线程实现递归加锁的功能,可以使用@synchronized

image.png

7、读写锁

读写锁的特性:多读单写,读写互斥


image.png

需要创建一个并发队列,这样可以保证读的操作可以实现多读,然后通过一个栅栏函数可以实现同一个队列里面写的操作在读之后。读的操作使用一个同步方法,可以保证ret值的正确性。

上一篇 下一篇

猜你喜欢

热点阅读