iOS线程同步方案总结,OC底层知识

作者:新闻中心
为什么要用锁?

为了保证多线程访问一块公共资源时,对资源的保护。或者说是多线程安全 or 线程同步但是线程同步的实现并不是只有加锁才能解决,串行队列也是一种解决方式。

参考:
正确使用多线程同步锁@synchronized()
iOS中的锁
iOS多线程安全详解
iOS 常见知识点(三):Lock

一、简介:多线程在之前进行过一篇详细的基础博客 iOS多线程

demo: ThreadSynchronization

锁通用使用步骤
//带❀的是一定要有的步骤。 ❀初始化锁 | 赋予一定参数❀加锁 | 通过一定条件加锁等待 | 线程进入 wait 等待条件 ❀处理公共资源代码 { } ❀解锁 | 给锁赋予条件销毁锁 & 锁的属性

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀正片❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

介绍: 是一种'自旋锁'使用: #import <libkern/OSAtomic.h> OSSpinLock lock = OS_SPINLOCK_INIT; //加锁 OSSpinLockLock(&lock); //尝试加锁 BOOL lockStatus = OSSpinLockTry(&lock); //你需要保护的操作 {} //解锁 OSSpinLockUnlock(&lock);#define OS_SPINLOCK_INIT 0 (就是把lock赋值为 0)不过这个锁已经被废弃掉了。可查看.h文件中的介绍。'OSSpinLock' is deprecated: first deprecated in iOS 10.0 - Use os_unfair_lock() from <os/lock.h> instead

废弃原因:新版 iOS 中,系统维护了 5 个不同的线程优先级/QoS: background,utility,default,user-initiated,user-interactive。高优先级线程始终会在低优先级线程前执行,一个线程不会受到比它更低优先级线程的干扰。这种线程调度算法会产生潜在的优先级反转问题,从而破坏了 spin lock。具体来说,如果一个低优先级的线程获得锁并访问共享资源,这时一个高优先级的线程也尝试获得这个锁,它会处于 spin lock 的忙等状态从而占用大量 CPU。此时低优先级线程无法与高优先级线程争夺 CPU 时间,从而导致任务迟迟完不成、无法释放 lock。这并不只是理论上的问题,libobjc 已经遇到了很多次这个问题了,于是苹果的工程师停用了 OSSpinLock。

but, 除非开发者能保证访问锁的线程全部都处于同一优先级,否则 iOS 系统中所有类型的自旋锁都不能再使用了。

介绍: 是一种低级锁('Low-level'),'互斥锁' ,看了好多博客说是自旋锁,其实都是错的。os_unfair_lock虽然是 'OSSpinLock' 的替代品,但是它确实是互斥锁。 
		

本文由新葡京8455发布,转载请注明来源

关键词: