iOS面试题:两个线程分别依次打印奇偶数

练习

- (void)semaphore
{
    dispatch_semaphore_t semap1 = dispatch_semaphore_create(1);
    dispatch_semaphore_t semap2 = dispatch_semaphore_create(1);
    
    __block int i = 0;
    
    dispatch_queue_t queue1 = dispatch_queue_create("111", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t queue2 = dispatch_queue_create("222", DISPATCH_QUEUE_CONCURRENT);

    // 消耗掉偶数队列的信号量
    dispatch_semaphore_wait(semap1, DISPATCH_TIME_FOREVER);

    dispatch_async(queue1, ^{
                
        while (i < 100) {
            dispatch_semaphore_wait(semap1, DISPATCH_TIME_FOREVER);
            NSLog(@"偶数线程:%d",i);
            i ++;
            dispatch_semaphore_signal(semap2);
        }

    });

    dispatch_async(queue2, ^{

        while (i < 100) {
            dispatch_semaphore_wait(semap2, DISPATCH_TIME_FOREVER);
            NSLog(@"奇数线程:%d",i);
            i ++;
            dispatch_semaphore_signal(semap1);
        }
        
    });
}

- (void)lockTest
{
    __block int i = 0;
    NSLock *lock1 = [[NSLock alloc] init];
    NSLock *lock2 = [[NSLock alloc] init];
    dispatch_queue_t queue1 = dispatch_queue_create("111", DISPATCH_QUEUE_CONCURRENT);

    [lock2 lock];
    
    dispatch_async(queue1, ^{
                
        while (i < 100) {
            
            [lock1 lock];
            NSLog(@"偶数线程:%d",i);
            i ++;
            [lock2 unlock];
        }
        
    });
    
    dispatch_async(queue1, ^{
                
        while (i < 100) {
            
            [lock2 lock];
            NSLog(@"奇数线程:%d",i);
            i ++;
            [lock1 unlock];

        }
        
    });
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容