b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

线程安全: 互斥锁和自旋锁(10种类型)(2)

电脑杂谈  发布时间:2020-05-06 03:13:54  来源:网络整理

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互斥锁

线程池与线程_多线程mutex_c# 线程 线程池

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

c# 线程 线程池_线程池与线程_多线程mutex

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的各种锁上的性能测试图

image.png

本文包含在SwiftTips

参考:

不再安全的OSSpinLock

深入了解iOS开发中的锁

作者: Dariel


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-200179-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...