include <或雹linux/spinlock.h>
spinlock_t mysiglock = SPIN_LOCK_UNLOCKED
unsigned int flags
再稿雹加上这个
#include <asm/system.h>
多线程使用不当会出现资源竞争,比如多个线程同时对一块资源进行修改,就会很容易引发数据错乱和数据安全问题。
示例:
以购票系统为例,
对于多线程出现的这种问题,我们的解决办法就是使用线程同步技术,而常见的就册孙是加锁。
2.1 OSSpinLock 自旋锁
自旋锁等待锁的线程会处于忙等(busy-wait)状态,一直占用着CPU资源。
并且现在已经不安全,可能出现优先级反转的问题。
如果等待锁的优先级较高,它会一直占用着CPU的资源,优先级低的线程就无法释放锁。
在iOS10被苹果废弃。由于已经不再安全, 这里不讨论用法了.
2.2 os_unfair_lock
导入头文件 #import <os/lock.h>
调用 ticketTest 方法
打印结果:
2.3 pthread_mutex 互斥锁
普通用法
导入头文件 #import <pthread.h>
调用 ticketTest 方法
打印结果:
mutex 也叫“互斥锁”,等待锁的线程处于休眠状态,不是忙等状态。
上面使用的是 Normal 类型同 OSSpinLock 和 os_unfair_lock 作用一样
递归用法
递归锁在被同一线程重复获取时不会产生死锁
递归类型 PTHREAD_MUTEX_RECURSIVE :
条件用法
2.4 NSLock、迟姿拦NSRecursiveLock
NSLock 是对 mutex 普通锁的封装
NSRecursiveLock 是对 mutex 递归锁的封装
调用 ticketTest 方法
打印结果:
NSRecursiveLock 用法与 NSLock 的用法一样。
2.5 NSCondition
NSCondition 是对 mutex 和码胡 cond 的封装
2.6 NSConditionLock
它是对 NSCondition 的进一步封装,可以设置具体的条件值
2.7 dispatch_queue
直接使用GCD的串行队列,也可以实现线程同步
调用ticketTest方法
打印结果:
2.8 dispatch_semaphore
信号量的初始值可以控制线程并发访问的最大值
初始值为1时,代表同时只允许1条线程访问资源,保证线程的同步
调用otherTest会发现每隔两秒打印5条信息。
2.9 @synchronized
是对mutex的递归锁的封装,源码objc4中的objc-sync.mm文件查看
@synchronized(obj)内部会生成obj对应的递归锁,然后进行加锁解锁 *** 作
本文来自: 旺仔大包子
推荐上篇文章: iOS多线程之NSOperation的使用
在iOS开发中经常会遇到一块资源被多个线程共享的情况,也就是多个线程会访问同一块资源,比如多个线程访问同一个对象、同一个变量、同一个文件,当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题衡则
使用线程同步技术(同步就是协同步调,按预定的先后顺序进行),常见的同步技术时加锁
OSSpinLock叫做”自旋锁”,等待锁的线程会处于忙等(busy-wait)状态,一直占用着CPU资源,目前已经不再安全,从iOS10已经废弃了,可能会出现优先级反转问题,如果等待锁的线程优先级较高,它会一直占用着CPU资源,优先级低的线程就无法释放锁,使用需要导入头文件咐知棚#import <libkern/OSAtomic.h>。
os_unfair_lock用于取代不安全的OSSpinLock ,从iOS10开始才支持,从底层调用看,等待os_unfair_lock锁的线程会处于休眠状态,并非忙等,使用需要导入头文件#import <os/lock.h>。
mutex叫做”互斥锁”,等待锁的线程会处于休眠状态,使用需要导入头文件#import <pthread.h>
NSLock、NSRecursiveLock是对mutex普通锁的封装,NSLock遵守NSLocking协议
初始化锁 NSLock *lock = [[NSLock alloc] init]
NSRecursiveLock也是对mutex递归锁的封装,API跟NSLock基本一致
NSCondition是对mutex和cond的封装,NSCondition遵守NSLocking协议
NSCondition通常用于生产者消费者模式的业务中,当不满足条件时调用wait方法让消费者线程等待,当条件满足时调用signal方法通知消费者线程。
NSConditionLock是对NSCondition的进一步封装,可以设置具体的条件值
NSConditionLock都可以设置不同线程间的依赖,让满足条件值的线程先执行,不满足条件的线程处于等待状态。
semaphore叫做”信号量”,信号量猛芹的初始值,可以用来控制线程并发访问的最大数量,信号量的初始值为1,代表同时只允许1条线程访问资源,保证线程同步
@synchronized是对mutex递归锁的封装,源码查看:objc4中的 objc-sync.mm 文件,@synchronized(obj)内部会生成obj对应的递归锁,然后进行加锁、解锁 *** 作
性能从高到底排序
dispatch_barrier_async
dispatch_barrier_async又叫栅栏函数,这个函数传入的并发队列必须是自己通过dispatch_queue_cretate创建的,如果传入的是一个串行或是一个全局的并发队列,那这个函数便等同于dispatch_async函数的效果,使用栅栏函数可以保证同一时间只有一个线程可进行写 *** 作,读 *** 作可以有多少个线程进行。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)