三十九、多线程之(三)线程安全--锁(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循环,一直等待解锁,如果锁打开,就会跳过最后一行继续执行。

2、pthread_mutex 互斥锁
pthread_mutex相关函数

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

#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);