runtime objc-sync.h

版本:iOS13.5

objc-sync.h

需要引入头文件#import
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_SUCCESSOBJC_SYNC_NOT_OWNING_THREAD_ERROR

objc_sync_enterobjc_sync_exit需要组合使用,否则容易出现线程卡死。
两方法的作用是加锁,保证数据线程安全。
效果与dispatch semaphore.h的dispatch_semaphore_waitdispatch_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

你可能感兴趣的:(runtime objc-sync.h)