日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS 并行和并发

發布時間:2024/1/1 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS 并行和并发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、概念

1.并發 當有多個線程在操作時,如果系統只有一個CPU,則它根本不可能真正同時進行一個以上的線程,它只能把CPU運行時間劃分成若干個時間段,再將時間 段分配給各個線程執行,在一個時間段的線程代碼運行時,其它線程處于掛起狀。.這種方式我們稱之為并發(Concurrent)。

2.并行 當系統有一個以上CPU時,則線程的操作有可能非并發。當一個CPU執行一個線程時,另一個CPU可以執行另一個線程,兩個線程互不搶占CPU資源,可以同時進行,這種方式我們稱之為并行(Parallel)。

3.區別 并發和并行是即相似又有區別的兩個概念,并行是指兩個或者多個事件在同一時刻發生;而并發是指兩個或多個事件在同一時間間隔內發生。

二、理解

1.并發 一個送外賣的A需要把兩份外賣分別送到兩個客戶B和C手里。 A必須先送完B外賣才能接著送C的。這就是并發

2.并行 客戶C 分別從餓了么和美團訂了一共兩份外賣。那么外賣員A和外賣員B需要把外賣一同送到客戶C手里。 這就是并行

  在iOS中,經常可以看見有這樣的需求,就是一個方法要等另外一個方法執行完畢再做相對應的處理,比如說一些網絡請求,需要根據上一個請求的返回值做相對應的處理再執行第二個請求,所以我們不能讓兩個請求同時去請求網絡。下面就記錄以下通過GCD和NSOperationQueue來控制并發。

三、實現

1、CGD

dispatch_semaphore 信號量

  信號量是一個整型值并且具有初始計數值,信號量通常支持兩個操作:通知和等待。當信號被通知的時候計數值會增加,當信號量在線程上等待的時候,必要的情況下線程會被阻塞掉,直至信號被通知時計數值大于0,然后線程會減少這個計數繼續工作。

GCD中又3個信號量有關的操作:

dispatch_semaphore_create    信號量創建

dispatch_semaphore_signal    發送通知

dispatch_semaphore_wait     信號量等待

//GCD - (void)testGCD {@autoreleasepool {//創建信號量__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);//創建隊列dispatch_queue_t queue = dispatch_queue_create("testBlock", NULL);dispatch_async(queue, ^{for (int i=0; i<5; i++) {NSLog(@"i的值是%d",i);}//發送通知dispatch_semaphore_signal(sem);});//信號量等待dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);for (int j=0; j<5; j++) {NSLog(@"j的值是:%d",j);}} }//輸出結果2017-02-21 10:06:20.447 Test[1595:41886] i的值是0 2017-02-21 10:06:20.448 Test[1595:41886] i的值是1 2017-02-21 10:06:20.448 Test[1595:41886] i的值是2 2017-02-21 10:06:20.448 Test[1595:41886] i的值是3 2017-02-21 10:06:20.448 Test[1595:41886] i的值是4 2017-02-21 10:06:20.448 Test[1595:41845] j的值是:0 2017-02-21 10:06:20.449 Test[1595:41845] j的值是:1 2017-02-21 10:06:20.449 Test[1595:41845] j的值是:2 2017-02-21 10:06:20.449 Test[1595:41845] j的值是:3 2017-02-21 10:06:20.449 Test[1595:41845] j的值是:4

2、NSOperationQueue

//NSOperationQueue - (void)testNSOperationQueue {//創建一個隊列NSOperationQueue *queue = [[NSOperationQueue alloc] init];//設置最大線程數queue.maxConcurrentOperationCount = 5;//創建一個A操作NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{for (int i=0; i<5; i++) {NSLog(@"i的值是%d",i);}}];//創建一個B操作NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{for (int j=0; j<5; j++) {NSLog(@"j的值是:%d",j);}}];// 添加依賴 B要在A打印完在進行打印 所以是B依賴于A 那么只需要添加如下代碼即可完成[operationB addDependency:operationA];//分別加入到隊列中[queue addOperation:operationA];[queue addOperation:operationB]; }//輸出結果 2017-02-21 10:07:16.053 Test[1617:43062] i的值是0 2017-02-21 10:07:16.055 Test[1617:43062] i的值是1 2017-02-21 10:07:16.061 Test[1617:43062] i的值是2 2017-02-21 10:07:16.063 Test[1617:43062] i的值是3 2017-02-21 10:07:16.064 Test[1617:43062] i的值是4 2017-02-21 10:07:16.071 Test[1617:43043] j的值是:0 2017-02-21 10:07:16.081 Test[1617:43043] j的值是:1 2017-02-21 10:07:16.087 Test[1617:43043] j的值是:2 2017-02-21 10:07:16.088 Test[1617:43043] j的值是:3 2017-02-21 10:07:16.088 Test[1617:43043] j的值是:4

總結

以上是生活随笔為你收集整理的iOS 并行和并发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。