import <libkern/OSAtomic.h>
OSSpinLock lock = OS_SPINLOCK_INIT; (已经废弃)
OSSpinLockLock(&lock);
OSSpinLockUnlock(&lock);
自旋锁:
是一种用于保护多线程共享资源的锁,与一般互斥锁(mutex)不同之处在于当自旋锁尝试获取锁时以忙等待(busy waiting)的形式不断地循环检查锁是否可用。当上一个线程的任务没有执行完毕的时候(被锁住),那么下一个线程会一直等待(不会睡眠),当上一个线程的任务执行完毕,下一个线程会立即执行。
在多CPU的环境中,对持有锁较短的程序来说,使用自旋锁代替一般的互斥锁往往能够提高程序的性能。
忙等,但是会进入死锁,或者让线程优先级反转
import <os/lock.h>
os_unfair_lock lock = OS_UNFAIR_LOCK_INIT;
os_unfair_lock_lock(&lock);
os_unfair_lock_unlock(&lock);
这个并非是忙等,也是让等待的线程进入休眠状态,本质上说,是个互斥锁
import <pthread.h>
PTHREAD_MUTEX_RECURSIVE 递归锁 同一个线程对同一个锁能多次加锁
![](https://img.haomeiwen.com/i6074487/13feedb4b41b6ba3.png)
pthread_mutex_init(&_mutex, NULL); 就相当于属性里面PTHREAD_MUTEX_NORMAL
pthread_mutex – 条件锁
使用场景 两个线程同时执行,其中一个线程要在另外一个线程执行完成之后才能执行
给锁之间在加一个条件判断,除了结束之后的解锁之外,额外再加一把可以控制的钥匙,根据条件来进行提前开锁,以便后续执行
![](https://img.haomeiwen.com/i6074487/c48d40c07c0391f7.png)
//同时执行 删除 添加操作
-(void)ticketsTest{
[[[NSThread alloc]initWithTarget:self selector:@selector(add) object:nil] start];
[[[NSThread alloc]initWithTarget:self selector:@selector(remove) object:nil] start];
}
-(void)add{
sleep(1);
pthread_mutex_lock(&_mutex);
[self.data addObject:@"A"];
NSLog(@"添加数据");
//发送信号通知条件能继续往下执行
// pthread_cond_signal(&_cond);
//广播信号 对应的条件能往下继续执行了
pthread_cond_broadcast(&_cond);
pthread_mutex_unlock(&_mutex);
}
-(void)remove{
NSLog(@"开始删除数据");
pthread_mutex_lock(&_mutex);
if (self.data.count==0) {
//这时候会等待条件、并且打开当前锁、
//收到条件信号之后会重新加锁并执行后面的代码
pthread_cond_wait(&_cond, &_mutex);
}
[self.data removeLastObject];
pthread_mutex_unlock(&_mutex);
NSLog(@"删除数据");
}
-(void)dealloc{
//销毁锁
pthread_mutex_destroy(&_mutex);
//销毁条件
pthread_cond_destroy(&_cond);
}
pthread_cond_wait 相当于线程在这里睡了,只有收到了pthread_cond_signal(&_cond);(单条信号)
pthread_cond_broadcast(&_cond); (广播,所有这个条件的信号)信号唤醒,线程重新启动并执行后续的代码
NSLock(PTHREAD_MUTEX_NORMAL),NSConditionLock(增加了条件condition),NSRecursiveLock(递归锁,PTHREAD_MUTEX_RECURSIVE)
这三个锁,都是对pthread_mutex 的一个封装,用法也更加的简单
网友评论