iOS多线程

2020-08-10  本文已影响0人  KeepOnline

1.你理解的多线程?

2.iOS的多线程方案哪有几种?你更倾向于哪一种?

3.你在项目中用过GCD吗?

4.GCD的队列类型

5.说一下OperationQueue和GCD的区别,以及各自的优势

6.线程安全的处理手段有哪些?

7.OC你了解的锁有哪些?在你回答基础上进行二次提问

1.请问下面代码的打印结果是什么?

    dispatch_queue_t queue = dispatch_get_global(0, 0);
    dispatch_async(queue, ^{
        NSLog(@"1");
        [self performSelector:@selector(test) withObject:nil afterDelay:.0];
        NSLog(@"3");
    });
    - (void)test {
        NSLog(@"2");
    }

2.请问下面代码打印结果是什么?

    - (void)test {
        NSLog(@"2");
    }
    - (void)touchesBegan:(NSSet<UITouch *>)touches withEvent(UIEvent *)event {
        NSThread *thread = [[NSThread alloc] initWithBlock:^{
            NSLog(@"1");
        }];
        [thread start];
        [self performSelector:@selector(test) onThread:thread withObject:nil waitUntilDone:YES];
    }

iOS中的常见多线程方案

GCD的常用函数

GCD的队列

容易混淆的术语

各队列的执行效果

使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列(产生死锁)

队列组的使用

    dispatch_group_t group = dispatch_grout_create();
    dispatch_quque_t queue = dispatch_quque_create("myQueue", DISPATCH_QUQUE_CONCURRENT);
    dispatch_group_async(group, queue, ^{
        NSLog(@"执行任务1");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"执行任务2");
    });
    dispatch_group_notify(group, queue, ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"执行任务3");
        });
    });
    

多线程的安全隐患

iOS中的线程同步方案

NSLock、NSRecursiveLock

    @interface NSLock : NSObject <NSLocking> 
    - (BOOL)tryLock;
    - (BOOL)lockBeforeDate:(NSDate *)limit;
    @end
    
    @protocol NSLocking
    - (void)lock;
    - (void)unlock;
    @end

dispatch_semaphore

    // 信号量的初始值
    int value = 1;
    // 初始化信号量
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(value);
    // 如果信号量的值<=0,当前线程就会进入休眠等待(知道信号量的值>0)
    // 如果信号量的值>0,就会减1,然后往下执行后面的代码
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    // 让信号量的值加1
    dispatch_semaphore_signal(semaphore)

@synchronized

    @synchronized(obj) {
        // 任务
    }

自旋锁、互斥锁比较

iOS中的读写安全方案

phread_rwlock

    // 初始化锁
    pthread_rwlock_t lock;
    pthread_rwlock_init(&lock, NULL);
    // 读-加锁
    pthread_rwlock_rdlock(&lock);
    // 读-尝试加锁
    pthread_rwlock_tryrdlock(&lock);
    // 写-加锁
    pthread_rwlock_wrlock(&lock);
    // 写-尝试加锁
    pthread_rwlock_trywrlock(&lock);
    // 解锁
    pthread_rwlock_unlock(&lock);
    // 销毁
    pthread_rwlock_destory(&lock);

dispatch_barrier_async

    dispatch_queue_t queue = dispatch_queuq_create("rw_queue", DISPATCH_QUQUE_CONCURRENT);
    // 读
    dispatch_async(queue, ^{
        
    });
    // 写
    dispatch_barrier_async(queue, ^{
    
    });
上一篇 下一篇

猜你喜欢

热点阅读