美文网首页
多线程自旋锁、互斥锁

多线程自旋锁、互斥锁

作者: Jean_Lina | 来源:发表于2020-10-20 10:48 被阅读0次

semaphore:信号量
recursive:递归的
unfair:不公平
mutex:互斥

OSSpinLock:自旋锁,等待锁的线程一直处于忙等状态,一直占有着CPU资源。

os_unfair_lock:替代自旋锁,等待锁的线程处于休眠状态,不占有着CPU资源。

pthread_mutex_t:互斥锁,等待锁的线程处于休眠状态,不占有着CPU资源。

递归锁:允许同一条线程对一把锁进行重复加锁。

semaphore 信号量
信号量的初始值,可以用来控制线程并发访问的最大数量。
信号量的初始值为1,代表同时只允许有一条线程访问资源,保证线程同步。

OSSpinLock:自旋锁

#import <libkern/OSAtomic.h>
@property (nonatomic, assign) OSSpinLock moneyLock;
@property (nonatomic, assign) OSSpinLock ticketLock;
- (instancetype)init
{
    self = [super init];
    if (self) {
        _moneyLock = OS_SPINLOCK_INIT;
        _ticketLock = OS_SPINLOCK_INIT;
    }
    return self;
}
- (void)saveMoney {
    OSSpinLockLock(&_moneyLock);
    [super saveMoney];
    OSSpinLockUnlock(&_moneyLock);
}
- (void)drawMoney {
    OSSpinLockLock(&_moneyLock);
    [super drawMoney];
    OSSpinLockUnlock(&_moneyLock);
}

//- (void)saleTicket {
//    OSSpinLockLock(&_ticketLock);
//    [super saleTicket];
//    OSSpinLockUnlock(&_ticketLock);
//}
- (void)saleTicket {
    //通过静态变量定义锁
    static OSSpinLock ticketLock1 = OS_SPINLOCK_INIT;
    OSSpinLockLock(&ticketLock1);
    [super saleTicket];
    OSSpinLockUnlock(&ticketLock1);
}

os_unfair_lock:

#import <os/lock.h>
//通过属性定义锁
@property (nonatomic, assign) os_unfair_lock moneyLock;
@property (nonatomic, assign) os_unfair_lock ticketLock;
- (instancetype)init
{
    self = [super init];
    if (self) {
        _moneyLock = OS_UNFAIR_LOCK_INIT;
        _ticketLock = OS_UNFAIR_LOCK_INIT;
    }
    return self;
}
- (void)saveMoney {
    os_unfair_lock_lock(&_moneyLock);
    [super saveMoney];
    os_unfair_lock_unlock(&_moneyLock);
}
- (void)drawMoney {
    os_unfair_lock_lock(&_moneyLock);
    [super drawMoney];
    os_unfair_lock_unlock(&_moneyLock);
}
- (void)saleTicket {
    os_unfair_lock_lock(&_ticketLock);
    [super saleTicket];
    os_unfair_lock_unlock(&_ticketLock);
}

pthread_mutex_t:互斥锁

#import <pthread.h>
@property (nonatomic, assign) pthread_mutex_t moneyLock;
@property (nonatomic, assign) pthread_mutex_t ticketlock;
- (instancetype)init
{
    self = [super init];
    if (self) {
        [self initMutex:&_moneyLock];
        [self initMutex:&_ticketlock];
    }
    return self;
}
- (void)initMutex:(pthread_mutex_t *)mutex {
    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);
    //定义锁的类型:递归锁(存在递归调用,定义递归锁),普通锁
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
    pthread_mutex_init(mutex, &attr);
    pthread_mutexattr_destroy(&attr);
}
- (void)saveMoney {
    pthread_mutex_lock(&_moneyLock);
    [super saveMoney];
    pthread_mutex_unlock(&_moneyLock);
}
- (void)drawMoney {
    pthread_mutex_lock(&_moneyLock);
    [super drawMoney];
    pthread_mutex_unlock(&_moneyLock);
}
- (void)saleTicket {
    pthread_mutex_lock(&_ticketlock);
    [super saleTicket];
    pthread_mutex_unlock(&_ticketlock);
}
- (void)dealloc
{
    pthread_mutex_destroy(&_moneyLock);
    pthread_mutex_destroy(&_ticketlock);
}

相关文章

  • iOS底层探索-多线程锁

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

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

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

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

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

  • iOS中的自旋锁与互斥锁

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

  • 多线程

    同步锁,又叫互斥锁,@synchronized(self) 自旋锁:atomic:原子属性,多线程环境下,只有一个...

  • iOS 锁

    同步锁 自旋锁 互斥锁

  • 线程锁

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

  • CLH并发队列

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

  • iOS 多线程,自旋锁和互斥锁详解

    iOS 多线程,自旋锁和互斥锁详解[https://www.jianshu.com/p/a49739c41bac]...

  • iOS 多线程之GCD

    iOS 多线程,自旋锁和互斥锁详解[https://www.jianshu.com/p/a49739c41bac]...

网友评论

      本文标题:多线程自旋锁、互斥锁

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