iOS多线程面试题:使用两个线程交替打印奇偶数

多线程输出结果是不可控的,需要实现的结果是使用两个线程交替打印奇偶数

1.两个线程同时操作一个变量如:

_number = 0;

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

    dispatch_async(queue, ^{

        while(_number<100) {

            _number++;

            NSLog(@"%ld",_number);

        };

    });


    dispatch_async(queue, ^{

        while(_number<100) {

            _number++;

            NSLog(@"%ld",_number);

        };

    });

会出现打印值顺序不确定,重复或其他不确定结果。

2.为了确定结果能顺序打印1-100,可以给线程加锁

_number = 0;

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

    NSLock* lock = [[NSLockalloc]init];

    dispatch_async(queue, ^{

        while(_number<100) {

            [lock lock];

            NSLog(@"奇线程:%ld",_number);

            _number++;


            [lock unlock];

        };

    });


    dispatch_async(queue, ^{

        while(_number<100) {

            [lock lock];

            NSLog(@"偶线程:%ld",_number);

            _number++;

            [lock unlock];

        };

    });

这样可以保证结果是顺序输出,但保证不了奇线程打印奇数,偶线程打印偶数

3.我们可以使用条件锁来解决这个问题

_number = 0;

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

    NSCondition* conditionLock = [[NSConditionalloc]init];

    dispatch_async(queue, ^{

        while(_number<100) {

            [conditionLocklock];

            if(_number%2!=0) {

                NSLog(@"奇线程:%ld",(long)_number);

            }

            if(_number%2!=0) {

                [conditionLocksignal];//激活偶线程

                [conditionLockwait];//奇线程等待

            }

            _number++;

            [conditionLockunlock];

        };

    });


    dispatch_async(queue, ^{

        while(_number<100) {

            [conditionLocklock];

            if(_number%2==0) {

                NSLog(@"偶线程:%ld",(long)_number);

            }


            if(_number%2==0) {

                [conditionLocksignal];//激活奇线程

                [conditionLockwait];//偶线程等待

            }

            _number++;

            [conditionLockunlock];

        };

    });

思路是:奇线程打印奇数,唤醒偶线程,奇线程等待;偶线程被唤醒,打印偶数,唤醒奇线程,偶线程等待。交替进行。

总结:还是实战理解的更透彻。

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

推荐阅读更多精彩内容