ios同步異步 串行并行的理解

首先沒有同步線程和異步線程這個說法的
請注意:同步操作  異步操作   串行隊列  并行對列 這個才對  和線程沒關(guān)系 
一、串行隊列
1、同步運行
dispatch_queue_t searialQueue =dispatch_queue_create("SearialQueue",DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue_1, ^{
NSLog(@"searialQueue = %@", [NSThreadcurrentThread]);
});
打印出的結(jié)果是 searialQueue = <NSThread: 0x7f99bad06d10>{number = 1, name = main}
也就是說在串行隊列下同步執(zhí)行,線程函數(shù)會在創(chuàng)建隊列所在的線程中執(zhí)行,不會開辟新線程
2、異步運行
dispatch_queue_t searialQueue = dispatch_queue_create("SearialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue_1, ^{
NSLog(@"searialQueue = %@", [NSThread currentThread]);
});
打印出的結(jié)果是 searialQueue = <NSThread: 0x7fe91bc0fb20>{number = 2, name = (null)}
雖然沒打印出線程的名字,但從number = 2 可以看出創(chuàng)建了新的線程執(zhí)行任務(wù),也就是說在串行隊列下異步執(zhí)行,會開辟新的線程執(zhí)行操作,且不論有多好dispatch_sync,都只開辟一個線程,畢竟是串行隊列,也不難理解。
二、并行隊列
1、同步運行
dispatch_queue_t searialQueue = dispatch_queue_create("Queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue_1, ^{
NSLog(@"Queue = %@", [NSThread currentThread]);
});
打印出的結(jié)果是 Queue = <NSThread: 0x7ffc40c078d0>{number = 1, name = main}
我當(dāng)初的猜想是會開辟新線程,但明顯不是,線程函數(shù)依舊在創(chuàng)建隊列所在的線程中執(zhí)行,不會開辟新線程。
2、異步運行
dispatch_queue_t searialQueue = dispatch_queue_create("Queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue_1, ^{
NSLog(@"Queue = %@", [NSThread currentThread]);
});
打印出的結(jié)果是 Queue = <NSThread: 0x7fba4bc97180>{number = 2, name = (null)}
這個毫無疑問會開辟新線程執(zhí)行,而外補充一點的是,如果有此時有多個dispatch_async,就可能會開辟多少個線程執(zhí)行!
三、總結(jié):決定是否開辟新線程的是同步和異步操作,同步下不管是串行還是并行都不會開辟新線程。
串行隊列:同步:不開辟線程,在隊列所在的線程執(zhí)行
                    異步:開辟新線程(且僅一個)
并行隊列:同步:不開辟線程,在隊列所在的線程執(zhí)行
                     異步:開辟新線程,個數(shù)由任務(wù)的個數(shù)等決定
dispatch_queue_t q = dispatch_queue_create("duilie", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(q, ^{
        NSLog(@"%@ %d", [NSThread currentThread], i);
    });
應(yīng)該這么理解 
將  NSLog(@"%@ %d", [NSThread currentThread], i); 這個任務(wù)加到q隊列(可以是串行或者并行)中執(zhí)行,然后q隊列又是dispatch_async這種執(zhí)行順序,如果同步執(zhí)行那就在q隊列所在線程順序執(zhí)行不會開辟新線程,如果是并行執(zhí)行,那如果創(chuàng)建的隊列是異步隊列就可能開辟多個線程,如果是同步隊列那就只會開辟一個線程。如果q隊列和外部所在的隊列一樣可能會死鎖哦(就像主隊列)
同步操作dispatch_sync 和 異步操作dispatch_async 是放在隊列中的
關(guān)于同步和異步的理解:
同步操作dispatch_sync 其實我是這樣理解的,就是他阻塞了當(dāng)前線程,需要等當(dāng)前線程,在這個操作之前的任務(wù)必須完成才會往下走。

異步操作dispatch_async 其實我是這樣理解的,就是他不阻塞了當(dāng)前線程,不需要等當(dāng)前線程,不管你在這個操作之前的任務(wù)是否完成就會往下走。

dispatch_barrier_sync 和dispatch_barrier_async
iOS開發(fā)系列-線程同步dispatch_barrier_(a)sync:http://www.lxweimin.com/p/68a23031b1c1 
個人理解就是
可以把它拆開來dispatch_barrier +(a)sync
柵欄函數(shù)dispatch_barrier 作用是控制隊列中的任務(wù)執(zhí)行的順序 順序:柵欄前的任務(wù)全執(zhí)行—》柵欄任務(wù)—》柵欄后的任務(wù)
(a)sync和原先理解的一樣(就是這個柵欄任務(wù)加入隊列的執(zhí)行順序)
同步柵欄就相當(dāng)于一個斷點,在同一個對列里柵欄任務(wù)前插入的任務(wù)沒有完成時,這個隊列后面的任務(wù)就被阻塞了
異步柵欄就是我只管 在同一個對列里柵欄任務(wù)前插入的任務(wù)完成后我才執(zhí)行我的柵欄任務(wù),其他我不管

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容