2. 屏障屏障功能:
fence函数还可以执行线程同步. 当然,这必须在并行队列中. 仅当当前并行队列完成时,才会执行fence队列.
/// 创建并发队列
let queue = DispatchQueue(label: "queuename", attributes: .concurrent)
/// 异步函数
queue.async {
for _ in 1...5 {
print(Thread.current)
}
}
queue.async {
for _ in 1...5 {
print(Thread.current)
}
}
/// 栅栏函数
queue.async(flags: .barrier) {
print("barrier")
}
queue.async {
for _ in 1...5 {
print(Thread.current)
}
}
3. 其他互斥锁
1. pthread_mutex互斥锁

pthread表示POSIX线程,跨平台线程相关的API,pthread_mutex也是互斥锁. 互斥锁的实现原理与信号量非常相似,需要阻塞线程并使其休眠,需要进行上下文切换.
在通常情况下,线程只能申请一次锁定,并且仅在获得锁定后才能释放该锁定. 多个应用程序锁定或释放未获得的锁定将导致崩溃. 假设已经获得了锁,那么再次申请该锁,线程将因为等待释放锁而进入睡眠状态,因此无法再次释放锁,从而导致死锁.
这是基于pthread_mutex_t(安全的“ FIFO”互斥锁)MutexLock的基本软件包
1. @同步条件锁
在日常开发中最常用的应该是@synchronized,此关键字可用于修改变量,并自动为其添加和释放互斥锁. 这样,您可以确保该变量不会在“已更改”操作范围内被其他线程使用多线程mutex,但不再迅速存在. 实际上,@ synchronized在后台执行的操作是在objc_sync中调用objc_sync_enter和objc_sync_exit方法,并添加一些异常判断.
因此我们可以使用闭包自己封装集合.
func synchronized(lock: AnyObject, closure: () -> ()) {
objc_sync_enter(lock)
closure()
objc_sync_exit(lock)
}
// 使用
synchronized(lock: AnyObject) {
// 此处AnyObject不会被其他线程改变
}
2. 自旋锁
1. OSSpinLock自旋锁
最有效的锁多线程mutex,但在iOS10.0之后,此锁机制被放弃并被os_unfair_lock取代,
顾名思义,当不同优先级的线程申请锁时,它可以确保不会发生优先级倒置.
有关详细信息,请参见不再安全的大神ibireme OSSpinLock

2. os_unfair_lock自旋锁
对于非FIFO锁os_unfair_lock,为了用OSSPinLock替换新锁,Apple是一种高级锁,可以避免优先级引起的死锁问题. 由于优先级(导致死锁的问题),OSSPinLock先前已在iOS平台上发布.
注意: 此锁适用于小型情况下的有效锁,否则会消耗大量CPU资源.
var unsafeMutex = os_unfair_lock() os_unfair_lock_lock(&unsafeMutex) os_unfair_lock_trylock(&unsafeMutex) os_unfair_lock_unlock(&unsafeMutex)
这是基于os_unfair_lock的MutexLock软件包
3. 性能比较
这是ibireme在iPhone6和iOS9的各种锁上的性能测试图

本文包含在SwiftTips
中
参考:
不再安全的OSSpinLock
深入了解iOS开发中的锁
作者: Dariel
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-200179-2.html
靠分红成吗