美文网首页
锁的使用

锁的使用

作者: heart_领 | 来源:发表于2018-10-30 14:12 被阅读8次
    #import "ViewController.h"
    #import <pthread.h>
    #import <libkern/OSAtomic.h>//OSSpinLock
    #import <QuartzCore/QuartzCore.h>
    
    typedef NS_ENUM(NSUInteger, LockType) {
        LockTypeOSSpinLock = 0,
        LockTypedispatch_semaphore,
        LockTypepthread_mutex,
        LockTypeNSCondition,
        LockTypeNSLock,
        LockTypepthread_mutex_recursive,
        LockTypeNSRecursiveLock,
        LockTypeNSConditionLock,
        LockTypesynchronized,
        LockTypeCount,
    };
    
    
    NSTimeInterval TimeCosts[LockTypeCount] = {0};
    int TimeCount = 0;
    
    @interface ViewController ()
    
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        [self setupUI];
    }
    
    - (IBAction)clearAllData:(id)sender {
        for (NSUInteger i = 0; i < LockTypeCount; i++) {
            TimeCosts[i] = 0;
        }
        TimeCount = 0;
        printf("---- clear ----\n\n");
    }
    
    - (void)setupUI{
        int buttonCount = 5;
        for (int i = 0; i < buttonCount; i++) {
            UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
            button.frame = CGRectMake(0, 0, 200, 50);
            button.center = CGPointMake(self.view.frame.size.width / 2, i * 60 + 160);
            button.tag = pow(10, i + 3);
            [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
            [button setTitle:[NSString stringWithFormat:@"run (%d)",(int)button.tag] forState:UIControlStateNormal];
            [button addTarget:self action:@selector(tap:) forControlEvents:UIControlEventTouchUpInside];
            [self.view addSubview:button];
        }
    }
    
    
    - (void)tap:(UIButton *)sender {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [self test1:(int)sender.tag];
        });
    }
    
    - (void)test1:(int)count{
        NSLog(@"******%f",TimeCosts[LockTypeCount]);
        {
            NSLog(@"我是一号");
        }
        
        {
            NSLog(@"我是二号");
        }
    }
    - (void)test:(int)count {
        NSTimeInterval begin, end;
        TimeCount += count;
        
        {
            // 不再安全的 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();
            NSLog(@"111111:%f",TimeCosts[LockTypeOSSpinLock]);
            TimeCosts[LockTypeOSSpinLock] += end - begin;
            NSLog(@"222222:%f",TimeCosts[LockTypeOSSpinLock]);
            printf("OSSpinLock:               %8.2f ms\n", (end - begin) * 1000);
        }
        
        
        {
            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();
            TimeCosts[LockTypedispatch_semaphore] += end - begin;
            printf("dispatch_semaphore:       %8.2f ms\n", (end - begin) * 1000);
        }
        
        
        {
            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);
        }
        
        
        {
            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);
        }
        
        
        {
            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);
        }
        
        
        {
            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();
            TimeCosts[LockTypepthread_mutex_recursive] += end - begin;
            pthread_mutex_destroy(&lock);
            printf("pthread_mutex(recursive): %8.2f ms\n", (end - begin) * 1000);
        }
        
        
        {
            NSRecursiveLock *lock = [NSRecursiveLock new];
            begin = CACurrentMediaTime();
            for (int i = 0; i < count; i++) {
                [lock lock];
                [lock unlock];
            }
            end = CACurrentMediaTime();
            TimeCosts[LockTypeNSRecursiveLock] += end - begin;
            printf("NSRecursiveLock:          %8.2f ms\n", (end - begin) * 1000);
        }
        
        
        {
            NSConditionLock *lock = [[NSConditionLock alloc] initWithCondition:1];
            begin = CACurrentMediaTime();
            for (int i = 0; i < count; i++) {
                [lock lock];
                [lock unlock];
            }
            end = CACurrentMediaTime();
            TimeCosts[LockTypeNSConditionLock] += end - begin;
            printf("NSConditionLock:          %8.2f ms\n", (end - begin) * 1000);
        }
        
        
        {
            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);
        }
        
        printf("---- fin (%d) ----\n\n",count);
    }
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    @end
    
    locks.png

    相关文章

      网友评论

          本文标题:锁的使用

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