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];

        }
        
    });
}

你可能感兴趣的:(iOS面试题:两个线程分别依次打印奇偶数)