java 底层

三十九、多线程之(三)线程安全--锁(OSSpinLock、os

2019-05-13  本文已影响0人  yqc5521

iOS中线程同步方案

OSSpinLock
os_unfair_lock
pthread_mutex
dispatch_semaphore
dispatch_queue(DISPATCH_QUEUE_SERIAL)
NSLock
NSRecursiveLock
NSCondition
NSConditionLock
@synchronized

1、OSSpinLock 自旋锁

缺点:有优先级翻转的情况,
在第四行到最后一行,来回调用。类似于while循环,一直等待解锁,如果锁打开,就会跳过最后一行继续执行。


OSSpinLock汇编

2、pthread_mutex 互斥锁

pthread_mutex相关函数


相关函数

原理:等待解锁的过程,会调用callsys,调用系统方法,让CPU休眠。

pthread_mutex汇编
#import "ViewController.h" 
#import <pthread/pthread.h>
@interface ViewController ()
@property (nonatomic, assign) pthread_mutex_t mutex;
@property (nonatomic, strong) NSMutableArray *arr; 
@property (nonatomic, assign) pthread_cond_t cond;
@end

@implementation ViewController 
- (void)viewDidLoad {
    [super viewDidLoad];
    self.arr = [NSMutableArray array]; 
    pthread_mutex_init(&_mutex, NULL);
    pthread_cond_init(&_cond, NULL);  
    [[[NSThread alloc] initWithTarget:self selector:@selector(remove) object:nil] start];
    sleep(1);
    [[[NSThread alloc] initWithTarget:self selector:@selector(add) object:nil] start]; 
}

- (void)remove{ 
    pthread_mutex_lock(&_mutex);
    NSLog(@"remove--lock");
    if (self.arr.count == nil || self.arr.count == 0) {
        NSLog(@"wait--unlock");
        pthread_cond_wait(&_cond, &_mutex);
    }
     if (self.arr.count == 1) {
        NSLog(@"remove--unlock"); 
    }
    NSLog(@"remove--lock");
    NSLog(@"removeLastObject");
    [self.arr removeLastObject];
    NSLog(@"remove--unlock");
    pthread_mutex_unlock(&_mutex);
} 
- (void)add{
       pthread_mutex_lock(&_mutex);
    NSLog(@"add--lock");
    [self.arr addObject:@"aaa"];
    NSLog(@"addObject");
    pthread_mutex_unlock(&_mutex);
    NSLog(@"add--unlock");
    pthread_cond_signal(&_cond);
    NSLog(@"signal");
} 
- (void)dealloc{
    pthread_mutex_destroy(&_mutex);
    pthread_cond_destroy(&_cond);
} 
@end

打印结果:


条件互斥锁

3、os_unfair_lock_t互斥锁,类似于pthread_mutex

os_unfair_lock_t unfairLock;     
unfairLock = &(OS_UNFAIR_LOCK_INIT);     
os_unfair_lock_lock(unfairLock);     
os_unfair_lock_unlock(unfairLock);
上一篇 下一篇

猜你喜欢

热点阅读