4.pthread_mutex 与 pthread_mutex(recursive)
pthread 表示 POSIX thread,定义了一组跨平台的线程相关的 API,POSIX 互斥锁是一种超级易用的互斥锁,使用的时候:
-
只需要使用 pthread_mutex_init 初始化一个 pthread_mutex_t,
pthread_mutex_lock 或者 pthread_mutex_trylock 来锁定 ,
pthread_mutex_unlock 来解锁,
当使用完成后,记得调用 pthread_mutex_destroy 来销毁锁。
常用相关API:
pthread_mutex_init(pthread_mutex_t *restrict _Nonnull, const pthread_mutexattr_t *restrict _Nullable);
pthread_mutex_lock(pthread_mutex_t * _Nonnull);
pthread_mutex_trylock(pthread_mutex_t * _Nonnull);
pthread_mutex_unlock(pthread_mutex_t * _Nonnull);
pthread_mutex_destroy(pthread_mutex_t * _Nonnull);
用法:
//pthread_mutex
- (void)viewDidLoad {
[super viewDidLoad];
[self pthread_mutex];
}
- (void)pthread_mutex {
__block pthread_mutex_t cjlock;
pthread_mutex_init(&cjlock, NULL);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
pthread_mutex_lock(&cjlock);
NSLog(@"线程1开始");
sleep(3);
NSLog(@"线程1结束");
pthread_mutex_unlock(&cjlock);
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(1);
pthread_mutex_lock(&cjlock);
NSLog(@"线程2");
pthread_mutex_unlock(&cjlock);
});
}
控制台输出:
2017-10-23 14:50:29.842180+0800 Thread-Lock[74478:1647362] 线程1开始
2017-10-23 14:50:32.846786+0800 Thread-Lock[74478:1647362] 线程1结束
2017-10-23 14:50:32.847001+0800 Thread-Lock[74478:1647359] 线程2
//pthread_mutex(recursive)
- (void)viewDidLoad {
[super viewDidLoad];
[self pthread_mutex_recursive];
}
- (void)pthread_mutex_recursive {
__block pthread_mutex_t cjlock;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&cjlock, &attr);
pthread_mutexattr_destroy(&attr);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
static void (^RecursiveBlock)(int);
RecursiveBlock = ^(int value) {
pthread_mutex_lock(&cjlock);
NSLog(@"%d加锁成功",value);
if (value > 0) {
NSLog(@"value = %d", value);
sleep(1);
RecursiveBlock(value - 1);
}
NSLog(@"%d解锁成功",value);
pthread_mutex_unlock(&cjlock);
};
RecursiveBlock(3);
});
}
//控制台输出:
2017-10-23 15:31:51.599693+0800 Thread-Lock[74723:1668089] 3加锁成功
2017-10-23 15:31:51.599912+0800 Thread-Lock[74723:1668089] value = 3
2017-10-23 15:31:52.602002+0800 Thread-Lock[74723:1668089] 2加锁成功










