美文网首页
iOS中锁的介绍和使用

iOS中锁的介绍和使用

作者: 我是晶锅 | 来源:发表于2019-04-25 21:04 被阅读0次

线程安全是很重要的,所以为了解决线程安全的问题,可以使用加锁的方式解决。但是各种锁有不用的特点,所以使用的时候需要根据场景来确定。

介绍几种iOS中常见的锁的使用方法和性能排比。各自属于什么类型的锁。


image.png

自旋锁

用于多线程同步的一种锁,线程反复检查锁变量是否可用。由于线程在这一过程中保持执行,因此是一种忙等待。一旦获取了自旋锁,线程会一直保持该锁,直至显式释放自旋锁。 自旋锁避免了进程上下文的调度开销,因此对于线程只会阻塞很短时间的场合是有效的。

OSSpinLock
        // 不再安全的 OSSpinLock  除此dispatch_semaphore 和 pthread_mutex 性能是最高的
        OSSpinLock lock = OS_SPINLOCK_INIT;
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            OSSpinLockLock(&lock);
            OSSpinLockUnlock(&lock);
        }
        end = CACurrentMediaTime();
        TimeCosts[LockTypeOSSpinLock] += end - begin;
        printf("OSSpinLock:               %8.2f ms\n", (end - begin) * 1000);
@synchronized
        NSObject *lock = [NSObject new];
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            @synchronized(lock) {}
        }
        end = CACurrentMediaTime();
        TimeCosts[LockTypesynchronized] += end - begin;
        printf("@synchronized:            %8.2f ms\n", (end - begin) * 1000);

互斥锁(Mutex)

是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制。该目的通过将代码切片成一个一个的临界区而达成。

pthread_mutex_t
        pthread_mutex_t lock;
        pthread_mutex_init(&lock, NULL);
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            pthread_mutex_lock(&lock);
            pthread_mutex_unlock(&lock);
        }
        end = CACurrentMediaTime();
        TimeCosts[LockTypepthread_mutex] += end - begin;
        pthread_mutex_destroy(&lock);
        printf("pthread_mutex:            %8.2f ms\n", (end - begin) * 1000);

NSLock
        NSLock *lock = [NSLock new];
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            [lock lock];
            [lock unlock];
        }
        end = CACurrentMediaTime();
        TimeCosts[LockTypeNSLock] += end - begin;
        printf("NSLock:                   %8.2f ms\n", (end - begin) * 1000);

读写锁

计算机程序的并发控制的一种同步机制,也称“共享-互斥锁”、多读者-单写者锁) 用于解决多线程对公共资源读写问题。读操作可并发重入,写操作是互斥的。 读写锁通常用互斥锁、条件变量、信号量实现。
读写锁一般是自己实现的。

信号量(semaphore)

一种更高级的同步机制,互斥锁可以说是semaphore在仅取值0/1时的特例。信号量可以有更多的取值空间,用来实现更加复杂的同步,而不单单是线程间互斥。

dispatch_semaphore_t
        dispatch_semaphore_t lock =  dispatch_semaphore_create(2);
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
            
            dispatch_semaphore_signal(lock);
        }
        end = CACurrentMediaTime();
        TimeCosts[LockTypedispatch_semaphore] += end - begin;
        printf("dispatch_semaphore:       %8.2f ms\n", (end - begin) * 1000);

条件锁

就是条件变量,当进程的某些资源要求不满足时就进入休眠,也就是锁住了。当资源被分配到了,条件锁打开,进程继续运行。

        NSCondition *lock = [NSCondition new];
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            [lock lock];
            [lock unlock];
        }
        end = CACurrentMediaTime();
        TimeCosts[LockTypeNSCondition] += end - begin;
        printf("NSCondition:              %8.2f ms\n", (end - begin) * 1000);

另外,需要特别说明一下,属性的原子性操作atomic是setter和getter都会加上一个自旋锁的。

相关文章

  • iOS中锁的介绍和使用

    自旋锁和互斥锁 共同点:都能保证同一时刻只能有一个线程操作锁住的代码。都能保证线程安全。不同点: 互斥锁(mute...

  • iOS中锁的介绍和使用

    锁 线程安全是很重要的,所以为了解决线程安全的问题,可以使用加锁的方式解决。但是各种锁有不用的特点,所以使用的时候...

  • iOS底层探索之多线程(三)—初识GCD

    回顾 在前两篇博客,已经介绍了进程和线程,还介绍了自旋锁和互斥锁等相关内容,在 iOS 开发中,使用最多的还是 G...

  • iOS中的锁的介绍及使用

    在平时的开发中经常使用到多线程,在使用多线程的过程中,难免会遇到资源竞争的问题,那我们怎么来避免出现这种问题那? ...

  • ios 锁的种类及性能

    一、基本概念 ios中的锁主要可以分为两大类,互斥锁 和 自旋锁,其他锁都是这两种锁的延伸和扩展。 1、介绍 互斥...

  • OC--各种线程锁

    参考:正确使用多线程同步锁@synchronized()iOS中的锁iOS多线程安全详解iOS 常见知识点(三):...

  • iOS中的锁(5)

    iOS中的锁(5) 本文主要介绍pthread和读写锁,以及自定义一个简单的读写锁。 1. pthread 1.1...

  • iOS中CAShapeLayer的介绍和使用

    CAShapeLayer是图形layer层,我们可以自定义这个层的形状。CAShapeLayer是一个通过矢量图形...

  • iOS中的锁详细介绍

    一.前言 在开发中我们经常会使用多线程,多线程为我们带来了很大便利,提高了程序的执行效率,但同时也带来了data ...

  • iOS笔记:深入理解 iOS 开发中的锁

    本文转载自:深入理解 iOS 开发中的锁作者博客:bestswifter 摘要 本文的目的不是介绍 iOS 中各种...

网友评论

      本文标题:iOS中锁的介绍和使用

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