iOS多线程面试题-启动三个线程A,B,C,打印10次 按照ABC的顺序输出(异步转同步)

题目:
启动三个线程A,B,C,打印10次 按照ABC的顺序输出

1. OC 使用NSLock


    NSLock *lockA = [[NSLock alloc] init];
    NSLock *lockB = [[NSLock alloc] init];
    NSLock *lockC = [[NSLock alloc] init];
    
    [lockB lock];
    [lockC lock];
    
    dispatch_queue_t queueA = dispatch_queue_create("queuea", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queueA, ^{
        for (int i = 0; i<10; i++) {
            [lockA lock];
            NSLog(@"A======= %@",@(i));
            [lockB unlock];
        }
    });
    
    dispatch_queue_t queueB = dispatch_queue_create("queueb", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queueB, ^{
        for (int i = 0; i<10; i++) {
            [lockB lock];
             NSLog(@"B======= %@",@(i));
            [lockC unlock];
        }
    });
    
    dispatch_queue_t queueC = dispatch_queue_create("queuec", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queueC, ^{
        for (int i = 0; i<10; i++) {
            [lockC lock];
             NSLog(@"C======= %@",@(i));
             NSLog(@"   ");
            [lockA unlock];
        }
    });

输出:

2019-06-20 01:06:23.384170+0800 xxtest[2808:669702] A======= 0
2019-06-20 01:06:23.384379+0800 xxtest[2808:669701] B======= 0
2019-06-20 01:06:23.384515+0800 xxtest[2808:669703] C======= 0
2019-06-20 01:06:23.384613+0800 xxtest[2808:669703] 
2019-06-20 01:06:23.384750+0800 xxtest[2808:669702] A======= 1
2019-06-20 01:06:23.384878+0800 xxtest[2808:669701] B======= 1
2019-06-20 01:06:23.384992+0800 xxtest[2808:669703] C======= 1
2019-06-20 01:06:23.385716+0800 xxtest[2808:669703] 
2019-06-20 01:06:23.386194+0800 xxtest[2808:669702] A======= 2
2019-06-20 01:06:23.386590+0800 xxtest[2808:669701] B======= 2
2019-06-20 01:06:23.387100+0800 xxtest[2808:669703] C======= 2
2019-06-20 01:06:23.387497+0800 xxtest[2808:669703] 
2019-06-20 01:06:23.387857+0800 xxtest[2808:669702] A======= 3
2019-06-20 01:06:23.388317+0800 xxtest[2808:669701] B======= 3
2019-06-20 01:06:23.388663+0800 xxtest[2808:669703] C======= 3
2019-06-20 01:06:23.388969+0800 xxtest[2808:669703] 
2019-06-20 01:06:23.389857+0800 xxtest[2808:669702] A======= 4
2019-06-20 01:06:23.390137+0800 xxtest[2808:669701] B======= 4
2019-06-20 01:06:23.390546+0800 xxtest[2808:669703] C======= 4
2019-06-20 01:06:23.390847+0800 xxtest[2808:669703] 
2019-06-20 01:06:23.391203+0800 xxtest[2808:669702] A======= 5
2019-06-20 01:06:23.391476+0800 xxtest[2808:669701] B======= 5
2019-06-20 01:06:23.391854+0800 xxtest[2808:669703] C======= 5
2019-06-20 01:06:23.392134+0800 xxtest[2808:669703] 
2019-06-20 01:06:23.392443+0800 xxtest[2808:669702] A======= 6
2019-06-20 01:06:23.392804+0800 xxtest[2808:669701] B======= 6
2019-06-20 01:06:23.393107+0800 xxtest[2808:669703] C======= 6
2019-06-20 01:06:23.393413+0800 xxtest[2808:669703] 
2019-06-20 01:06:23.393685+0800 xxtest[2808:669702] A======= 7
2019-06-20 01:06:23.394006+0800 xxtest[2808:669701] B======= 7
2019-06-20 01:06:23.394301+0800 xxtest[2808:669703] C======= 7
2019-06-20 01:06:23.394578+0800 xxtest[2808:669703] 
2019-06-20 01:06:23.394959+0800 xxtest[2808:669702] A======= 8
2019-06-20 01:06:23.395532+0800 xxtest[2808:669701] B======= 8
2019-06-20 01:06:23.395873+0800 xxtest[2808:669703] C======= 8
2019-06-20 01:06:23.396117+0800 xxtest[2808:669703] 
2019-06-20 01:06:23.396508+0800 xxtest[2808:669702] A======= 9
2019-06-20 01:06:23.396897+0800 xxtest[2808:669701] B======= 9
2019-06-20 01:06:23.397307+0800 xxtest[2808:669703] C======= 9
2019-06-20 01:06:23.397649+0800 xxtest[2808:669703] 

2. OC 使用dispatch_semaphore

 dispatch_semaphore_t semaA = dispatch_semaphore_create(1);
    dispatch_semaphore_t semaB = dispatch_semaphore_create(0);
    dispatch_semaphore_t semaC = dispatch_semaphore_create(0);
    
    
    dispatch_queue_t queueA = dispatch_queue_create("queuea", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queueA, ^{
        for (int i = 0; i<10; i++) {
            dispatch_semaphore_wait(semaA, DISPATCH_TIME_FOREVER);
            NSLog(@"A======= %@",@(i));
            dispatch_semaphore_signal(semaB);
        }
    });
    
    dispatch_queue_t queueB = dispatch_queue_create("queueb", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queueB, ^{
        for (int i = 0; i<10; i++) {
            dispatch_semaphore_wait(semaB, DISPATCH_TIME_FOREVER);
            NSLog(@"B======= %@",@(i));
            dispatch_semaphore_signal(semaC);
        }
    });
    
    dispatch_queue_t queueC = dispatch_queue_create("queuec", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queueC, ^{
        for (int i = 0; i<10; i++) {
            dispatch_semaphore_wait(semaC, DISPATCH_TIME_FOREVER);
            NSLog(@"C======= %@",@(i));
            NSLog(@"   ");
            dispatch_semaphore_signal(semaA);
        }
    });
    

输出:

2019-06-20 01:40:25.050013+0800 xxtest[2938:708288] A======= 0
2019-06-20 01:40:25.050183+0800 xxtest[2938:708285] B======= 0
2019-06-20 01:40:25.050297+0800 xxtest[2938:708286] C======= 0
2019-06-20 01:40:25.050391+0800 xxtest[2938:708286] 
2019-06-20 01:40:25.050487+0800 xxtest[2938:708288] A======= 1
2019-06-20 01:40:25.050588+0800 xxtest[2938:708285] B======= 1
2019-06-20 01:40:25.050684+0800 xxtest[2938:708286] C======= 1
2019-06-20 01:40:25.050782+0800 xxtest[2938:708286] 
2019-06-20 01:40:25.050881+0800 xxtest[2938:708288] A======= 2
2019-06-20 01:40:25.050982+0800 xxtest[2938:708285] B======= 2
2019-06-20 01:40:25.051442+0800 xxtest[2938:708286] C======= 2
2019-06-20 01:40:25.051695+0800 xxtest[2938:708286] 
2019-06-20 01:40:25.051928+0800 xxtest[2938:708288] A======= 3
2019-06-20 01:40:25.052162+0800 xxtest[2938:708285] B======= 3
2019-06-20 01:40:25.052414+0800 xxtest[2938:708286] C======= 3
2019-06-20 01:40:25.052841+0800 xxtest[2938:708286] 
2019-06-20 01:40:25.053073+0800 xxtest[2938:708288] A======= 4
2019-06-20 01:40:25.053340+0800 xxtest[2938:708285] B======= 4
2019-06-20 01:40:25.053617+0800 xxtest[2938:708286] C======= 4
2019-06-20 01:40:25.053843+0800 xxtest[2938:708286] 
2019-06-20 01:40:25.054094+0800 xxtest[2938:708288] A======= 5
2019-06-20 01:40:25.055448+0800 xxtest[2938:708285] B======= 5
2019-06-20 01:40:25.055584+0800 xxtest[2938:708286] C======= 5
2019-06-20 01:40:25.055757+0800 xxtest[2938:708286] 
2019-06-20 01:40:25.055888+0800 xxtest[2938:708288] A======= 6
2019-06-20 01:40:25.056116+0800 xxtest[2938:708285] B======= 6
2019-06-20 01:40:25.056455+0800 xxtest[2938:708286] C======= 6
2019-06-20 01:40:25.056871+0800 xxtest[2938:708286] 
2019-06-20 01:40:25.057176+0800 xxtest[2938:708288] A======= 7
2019-06-20 01:40:25.057484+0800 xxtest[2938:708285] B======= 7
2019-06-20 01:40:25.057789+0800 xxtest[2938:708286] C======= 7
2019-06-20 01:40:25.058204+0800 xxtest[2938:708286] 
2019-06-20 01:40:25.058479+0800 xxtest[2938:708288] A======= 8
2019-06-20 01:40:25.058947+0800 xxtest[2938:708285] B======= 8
2019-06-20 01:40:25.059211+0800 xxtest[2938:708286] C======= 8
2019-06-20 01:40:25.059469+0800 xxtest[2938:708286] 
2019-06-20 01:40:25.059701+0800 xxtest[2938:708288] A======= 9
2019-06-20 01:40:25.060025+0800 xxtest[2938:708285] B======= 9
2019-06-20 01:40:25.060360+0800 xxtest[2938:708286] C======= 9
2019-06-20 01:40:25.060585+0800 xxtest[2938:708286] 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,089评论 1 32
  • 本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法。这大概是史上最详细、清晰的关于 GCD 的详细讲...
    花花世界的孤独行者阅读 495评论 0 1
  • iOS多线程编程 基本知识 1. 进程(process) 进程是指在系统中正在运行的一个应用程序,就是一段程序的执...
    陵无山阅读 6,004评论 1 14
  • 安迪,成功女性的代表。学历高,情商高,看似高冷,但内心善良,每当姐妹们遇到事情向她诉说时,她都会认真分析并且给出发...
    爱jian阅读 140评论 0 0
  • 有时会发现人和人之间真的有距离,而这种距离并不是离得远近的距离,而是灵魂和认知的距离!
    幸福妈妈雨后阳光阅读 137评论 0 0