美文网首页
自旋锁+互斥锁

自旋锁+互斥锁

作者: 如果大雨落下 | 来源:发表于2020-08-12 14:02 被阅读0次

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 递归锁 同一个线程对同一个锁能多次加锁

图片.png

pthread_mutex_init(&_mutex, NULL); 就相当于属性里面PTHREAD_MUTEX_NORMAL

pthread_mutex – 条件锁

使用场景 两个线程同时执行,其中一个线程要在另外一个线程执行完成之后才能执行
给锁之间在加一个条件判断,除了结束之后的解锁之外,额外再加一把可以控制的钥匙,根据条件来进行提前开锁,以便后续执行


图片.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 的一个封装,用法也更加的简单

相关文章

  • iOS 锁

    同步锁 自旋锁 互斥锁

  • iOS底层探索-多线程锁

    多线程的锁大致可分为两大类:互斥锁、自旋锁;也可以分为三类:互斥锁、自旋锁、读写锁。 一、互斥锁:互斥+同步(强调...

  • 线程锁

    1.常见的锁包括:互斥锁,自旋锁。 2.互斥锁是指锁的类型,自旋锁是指锁的实现方式。 3.互斥锁:当上...

  • CLH并发队列

    1 什么是自旋锁和互斥锁? 由于CLH锁是一种自旋锁,那么我们先来看看自旋锁是什么? 自旋锁说白了也是一种互斥锁,...

  • iOS面试题与核心基础之线程同步(锁,串行队列,信号量,@syn

    锁 iOS多线程锁有两类 自旋锁 和 互斥锁自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。资源已...

  • 多线程复习

    自旋锁 & 互斥锁 自旋锁:atomic、OSSpinLock、dispatch_semaphore_t临界区加锁...

  • iOS 开发中加锁

    [1].OSSpinLock 自旋锁 [1]自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被...

  • iOS 多线程面试题(自旋锁与互斥锁)

    自旋锁与互斥锁 自旋锁: 是一种用于保护多线程共享资源的锁,与一般互斥锁(mutex)不同之处在于当自旋锁尝试获取...

  • iOS中的自旋锁与互斥锁

    一:自旋锁与互斥锁 自旋锁:是一种用于保护多线程共享资源的锁,与一般互斥锁(mutex)不同之处在于当自旋锁尝试获...

  • C++锁

    锁的种类 互斥锁、条件锁、自旋锁、读写锁、递归锁。 互斥锁 头文件: 类型:pthread_mutex_t, 函数...

网友评论

      本文标题:自旋锁+互斥锁

      本文链接:https://www.haomeiwen.com/subject/gyyvrktx.html