zoukankan      html  css  js  c++  java
  • iOS数据锁

    简介

    当一个线程访问数据时,而其他数据不能进行访问,保证线程安全或者可以理解为执行多线程,对于共享资源访问时保证互斥的要求

    文章

    不再安全的 OSSpinLock

    iOS开发中的11种锁以及性能对比

    iOS 十种线程锁

    iOS多线程篇-NSThread-synchronized(互斥锁)

    分类

    1.自旋锁:是用于多线程同步的一种锁,线程反复检查锁变量是否可用(一直进行do while忙等)

    2.信号量:可以有更多的取值空间,用来实现更加复杂的同步,而不单单是线程间互斥

    3.互斥锁:是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制

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

    5.递归锁:在同一线程上该锁是可重入的,对于不同线程则相当于普通的互斥锁

    6.读写锁:对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作

    OSSpinLock

    - (void)osspinlock:(int)count{
        NSTimeInterval begin, end;
        OSSpinLock lock = OS_SPINLOCK_INIT;
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            OSSpinLockLock(&lock);
            OSSpinLockUnlock(&lock);
        }
        end = CACurrentMediaTime();
        printf("OSSpinLock:               %8.2f msn", (end - begin) * 1000);
    }
    
    

    os_unfair_lock(iOS10之后替代OSSPinLock的锁,解决了优先级反转的问题)

    - (void)os_unfair_lock:(int)count{
        if (@available(iOS 10.0, *)) {
            NSTimeInterval begin, end;
            os_unfair_lock_t unfairLock;
            unfairLock = &(OS_UNFAIR_LOCK_INIT);
            begin = CACurrentMediaTime();
            for (int i = 0; i < count; i++) {
                os_unfair_lock_lock(unfairLock);
                os_unfair_lock_unlock(unfairLock);
            }
            end = CACurrentMediaTime();
            printf("os_unfair_lock:           %8.2f msn", (end - begin) * 1000);
        }
    }
    
    
    信号量

    dispatch_semaphore

    - (void)dispatch_semaphore:(int)count{
        NSTimeInterval begin, end;
        dispatch_semaphore_t lock =  dispatch_semaphore_create(1);
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
            dispatch_semaphore_signal(lock);
        }
        end = CACurrentMediaTime();
        printf("dispatch_semaphore:       %8.2f msn", (end - begin) * 1000);
    }
    
    互斥锁

    NSLock

    • NSLock是最常使用的互斥锁,遵循NSLocking协议,通过lock和unlock来完成锁定和解锁*
    - (void)nslock:(int)count{
        NSTimeInterval begin, end;
        NSLock *lock = [NSLock new];
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            [lock lock];
            [lock unlock];
        }
        end = CACurrentMediaTime();
        printf("NSLock:                   %8.2f msn", (end - begin) * 1000);
        
    }
    

    pthread_mutex

    - (void)pthread_mutex:(int)count{
        NSTimeInterval begin, end;
        pthread_mutex_t lock;
        pthread_mutex_init(&lock,  大专栏  iOS数据锁NULL);
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            pthread_mutex_lock(&lock);
            pthread_mutex_unlock(&lock);
        }
        end = CACurrentMediaTime();
        pthread_mutex_destroy(&lock);
        printf("pthread_mutex:            %8.2f msn", (end - begin) * 1000);
        
    }
    

    synchronized

    - (void)synchronized:(int)count{
        NSTimeInterval begin, end;
        NSObject *lock = [NSObject new];
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            @synchronized(lock) {}
        }
        end = CACurrentMediaTime();
        printf("@synchronized:            %8.2f msn", (end - begin) * 1000);
        
    }
    
    条件锁

    NSCondition

    - (void)_NSCondition:(int)count{
        NSTimeInterval begin, end;
        NSCondition *lock = [NSCondition new];
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            [lock lock];
            [lock unlock];
        }
        end = CACurrentMediaTime();
        printf("NSCondition:              %8.2f msn", (end - begin) * 1000);
    }
    

    NSConditionLock

    - (void)_NSConditionLock:(int)count{
        NSTimeInterval begin, end;
        NSConditionLock *lock = [[NSConditionLock alloc] initWithCondition:1];
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            [lock lock];
            [lock unlock];
        }
        end = CACurrentMediaTime();
        printf("NSConditionLock:          %8.2f msn", (end - begin) * 1000);
        
    }
    
    递归锁

    NSRecursiveLock

    - (void)_NSRecursiveLock:(int)count{
        NSTimeInterval begin, end;
        NSRecursiveLock *lock = [NSRecursiveLock new];
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            [lock lock];
            [lock unlock];
        }
        end = CACurrentMediaTime();
        printf("NSRecursiveLock:          %8.2f msn", (end - begin) * 1000);
    }
    

    pthread_mutex_recursive

    - (void)pthread_mutex_recursive:(int)count{
        NSTimeInterval begin, end;
        pthread_mutex_t lock;
        pthread_mutexattr_t attr;
        pthread_mutexattr_init(&attr);
        pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
        pthread_mutex_init(&lock, &attr);
        pthread_mutexattr_destroy(&attr);
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            pthread_mutex_lock(&lock);
            pthread_mutex_unlock(&lock);
        }
        end = CACurrentMediaTime();
        pthread_mutex_destroy(&lock);
        printf("pthread_mutex(recursive): %8.2f msn", (end - begin) * 1000);
    
    }
    
    读写锁

    pthread_rwlock

    - (void)pthread_rwlock:(int)count{
        NSTimeInterval begin, end;
        pthread_rwlock_t rwlock;
        pthread_rwlock_init(&rwlock,NULL);
        begin = CACurrentMediaTime();
        for (int i = 0; i < count; i++) {
            pthread_rwlock_rdlock(&rwlock);
            pthread_rwlock_unlock(&rwlock);
        }
        end = CACurrentMediaTime();
        printf("pthread_rwlock:           %8.2f msn", (end - begin) * 1000);
    }
    

    总结

    通过各种常见锁介绍和性能评测,可以看出要是没有优先级反转的问题的话,osspinlock为最优,其次就是dispatch_semaphore,dispatch_semaphore和os_unfair_lock差距很小,然后就是pthread_mutex。

    代码下载

    TJLock


  • 相关阅读:
    使用Cmake生成makefile
    c++模板类(一)理解编译器的编译模板过程
    C++ 模板
    c++/c 获取cpp文件行号跟文件名
    java获取代码调用位置信息
    android获取手机ip
    Cocos2d-html5游戏开发,常用工具集合
    cocos2d-html5基础
    Cocos2d-x-html5之HelloWorld深入分析与调试
    基于ndk_r7_windows编译实现ndk项目,不需要cygwin
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12014376.html
Copyright © 2011-2022 走看看