版本:iOS13.5
objc-sync.h
需要引入头文件#import <objc/objc-sync.h>
runtime其他方法通道
索引
- 在对象obj上开始同步。
objc_sync_enter
- 在对象obj上结束同步。
objc_sync_exit
详解
- 在对象obj上开始同步。
int objc_sync_enter(id _Nonnull obj)
int 一旦成功开始同步锁,则返回OBJC_SYNC_SUCCESS。
enum {
//成功开始或结束同步
OBJC_SYNC_SUCCESS = 0,
//同步结束出现错误
OBJC_SYNC_NOT_OWNING_THREAD_ERROR = -1
};
- 在对象obj上结束同步。
int objc_sync_exit(id _Nonnull obj)
int 返回OBJC_SYNC_SUCCESS
或OBJC_SYNC_NOT_OWNING_THREAD_ERROR
objc_sync_enter
和objc_sync_exit
需要组合使用,否则容易出现线程卡死。
两方法的作用是加锁,保证数据线程安全。
效果与dispatch semaphore.h的dispatch_semaphore_wait
和dispatch_semaphore_signal
的组合使用效果一致,如下。
//此处应为1,为0时是另一个作用。
dispatch_semaphore_t sem = dispatch_semaphore_create(1);
//加锁
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
//解锁
dispatch_semaphore_signal(sem);
//加锁
int enter = objc_sync_enter(self);
//解锁
int exit = objc_sync_exit(self);
例:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (NSInteger i = 0; i < 2; i++) {
[self logIndex];
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (NSInteger i = 0; i < 2; i++) {
[self logIndex];
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (NSInteger i = 0; i < 2; i++) {
[self logIndex];
}
});
- (void)logIndex {
static NSInteger index = 0;
// objc_sync_enter(self);
index++;
NSLog(@"%ld", index);
// objc_sync_exit(self);
}
输出:
1
3
2
4
5
6
若将注释打开,则会输出:
1
2
3
4
5
6
网友评论