1. 程式人生 > >關於多執行緒中同步和非同步的理解

關於多執行緒中同步和非同步的理解

執行緒同步:就是多個執行緒同時訪問同一資源,必須等一個執行緒訪問結束,才能訪問其它資源,比較浪費時間,效率低
執行緒非同步:訪問資源時在空閒等待時可以同時訪問其他資源,實現多執行緒機制
說起來比較抽象,我用程式碼嘗試了一下

//以非同步的方式提交佇列
-(void)async
{
    dispatch_async(q1, ^{
        for (int i = 0; i < 10; i ++) {
            NSLog(@"q1=====%d",i);
        }
    });
}
//以同步的方式提交佇列
-(void)sync
{
    dispatch_sync
(q1, ^{ for (int i = 0; i < 10; i ++) { NSLog(@"q2-----%d",i); } }); }

先用以非同步的方式提交佇列

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    q1 = dispatch_queue_create("q1", DISPATCH_QUEUE_SERIAL);
    [self
async]; //[self sync]; NSLog(@"1111"); return YES; }

輸出如下
2016-08-15 22:21:06.341 TPZhihuDailyPurify[2076:1215297] q2—–8
2016-08-15 22:21:06.341 TPZhihuDailyPurify[2076:1215297] q2—–9
2016-08-15 22:21:06.341 TPZhihuDailyPurify[2076:1215297] 1111
2016-08-15 22:21:06.340 TPZhihuDailyPurify[2076:1215902] q1=====7
2016-08-15 22:21:06.342 TPZhihuDailyPurify[2076:1215902] q1=====8
2016-08-15 22:21:06.343 TPZhihuDailyPurify[2076:1215902] q1=====9
當然這個1111的位置每次執行都可能不一樣因為系統是在空閒時訪問其它資源,也就是程式繼續往下執行,輸出1111。
再用以同步的方式提交佇列

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    q1 = dispatch_queue_create("q1", DISPATCH_QUEUE_SERIAL);
    //[self async];
    [self sync];
    NSLog(@"1111");
    return YES;
}

輸出如下
016-08-15 22:26:09.541 TPZhihuDailyPurify[2099:1246463] q2—–5
2016-08-15 22:26:09.541 TPZhihuDailyPurify[2099:1246463] q2—–6
2016-08-15 22:26:09.541 TPZhihuDailyPurify[2099:1246463] q2—–7
2016-08-15 22:26:09.542 TPZhihuDailyPurify[2099:1246463] q2—–8
2016-08-15 22:26:09.542 TPZhihuDailyPurify[2099:1246463] q2—–9
2016-08-15 22:26:09.542 TPZhihuDailyPurify[2099:1246463] 1111
可以看出1111總是在最後輸出,因為同步必須等一個執行緒訪問結束,才能訪問其他資源,也就是程式繼續往下執行。