2017-10-23 15:31:52.602317+0800 Thread-Lock[74723:1668089] value = 2
2017-10-23 15:31:53.604669+0800 Thread-Lock[74723:1668089] 1加锁成功
2017-10-23 15:31:53.604957+0800 Thread-Lock[74723:1668089] value = 1
2017-10-23 15:31:54.607778+0800 Thread-Lock[74723:1668089] 0加锁成功
2017-10-23 15:31:54.608109+0800 Thread-Lock[74723:1668089] 0解锁成功
2017-10-23 15:31:54.608391+0800 Thread-Lock[74723:1668089] 1解锁成功
2017-10-23 15:31:54.608622+0800 Thread-Lock[74723:1668089] 2解锁成功
2017-10-23 15:31:54.608945+0800 Thread-Lock[74723:1668089] 3解锁成功
由以上内容总结:
-
它的用法和 NSLock 的 lock unlock 用法一致,而它也有一个 pthread_mutex_trylock 方法,pthread_mutex_trylock 和 tryLock 的区别在于,tryLock 返回的是 YES 和 NO,pthread_mutex_trylock 加锁成功返回的是 0,失败返回的是错误提示码。
pthread_mutex(recursive) 作用和 NSRecursiveLock 递归锁类似。如果使用 pthread_mutex_init(&theLock, NULL); 初始化锁的话,上面的代码的第二部分会出现死锁现象,使用递归锁就可以避免这种现象。
5. OSSpinLock
OSSpinLock 是一种自旋锁,和互斥锁类似,都是为了保证线程安全的锁。但二者的区别是不一样的,对于互斥锁,当一个线程获得这个锁之后,其他想要获得此锁的线程将会被阻塞,直到该锁被释放。但自选锁不一样,当一个线程获得锁之后,其他线程将会一直循环在哪里查看是否该锁被释放。所以,此锁比较适用于锁的持有者保存时间较短的情况下。
只有加锁,解锁,尝试加锁三个方法。
常用相关API:
typedef int32_t OSSpinLock;
// 加锁
void OSSpinLockLock( volatile OSSpinLock *__lock );
// 尝试加锁
bool OSSpinLockTry( volatile OSSpinLock *__lock );
// 解锁
void OSSpinLockUnlock( volatile OSSpinLock *__lock );
用法:
#import <libkern/OSAtomic.h>
- (void)viewDidLoad {
[super viewDidLoad];
[self osspinlock];
}
- (void)osspinlock {
__block OSSpinLock theLock = OS_SPINLOCK_INIT;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
OSSpinLockLock(&theLock);
NSLog(@"线程1开始");
sleep(3);
NSLog(@"线程1结束");
OSSpinLockUnlock(&theLock);
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
OSSpinLockLock(&theLock);
sleep(1);
NSLog(@"线程2");
OSSpinLockUnlock(&theLock);
});
}
控制台输出:
2017-10-23 16:02:48.865501+0800 Thread-Lock[75025:1684487] 线程1开始
2017-10-23 16:02:51.868736+0800 Thread-Lock[75025:1684487] 线程1结束
2017-10-23 16:02:52.922911+0800 Thread-Lock[75025:1684486] 线程2
YY大神 @ibireme 的文章也有说这个自旋锁存在优先级反转问题,具体文章可以戳 不再安全的 OSSpinLock,而 OSSpinLock 在iOS 10.0中被 <os/lock.h> 中的 os_unfair_lock 取代。










