如何使用spinlock要哪个头文件

如何使用spinlock要哪个头文件,第1张

在kernel2.4.20下面衫敬帆:

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函数的效果,使用栅栏函数可以保证同一时间只有一个线程可进行写 *** 作,读 *** 作可以有多少个线程进行。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8228451.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存