亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++  線程(串行 并行 同步 異步)詳解

 更新時間:2017年07月03日 11:31:03   作者:Love@YR  
這篇文章主要介紹了C++ 線程(串行 并行 同步 異步)詳解的相關(guān)資料,需要的朋友可以參考下

C++  線程(串行 并行 同步 異步)詳解

看了很多關(guān)于這類的文章,一直沒有總結(jié)。不總結(jié)的話就會一直糊里糊涂,以下描述都是自己理解的非官方語言,不一定嚴謹,可當作參考。

首先,進程可理解成一個可執(zhí)行文件的執(zhí)行過程。在ios app上的話我們可以理解為我們的app的.ipa文件執(zhí)行過程也即app運行過程。殺掉app進程就殺掉了這個app在系統(tǒng)里運行所占的內(nèi)存。

線程:線程是進程的最小單位。一個進程里至少有一個主線程。就是那個main thread。非常簡單的app可能只需要一個主線程即UI線程。當然大部分還是會有一些子線程的,比如如果你用了AFNetWorking,你的請求都是開辟了子線程。

關(guān)于串行,并行,同步,異步,我還是以下面代碼的方式做個說明。

首先button點擊事件運行在主線程里,先是在主線程里做了打印了一句話,然后創(chuàng)建了一個串行或者并行的隊列,之后連續(xù)創(chuàng)建了3個同步或者異步的block任務(wù)放入此隊列中,最后再在主線程里打印一句話。

- (IBAction)serialSync:(id)sender {
 NSLog(@"start log in main thread"]);
  dispatch_queue_t myQueue = dispatch_queue_create("myQueue", NULL);
  for (NSInteger n = 0; n < 3; n++) {
    dispatch_sync(myQueue, ^{
      for (NSInteger i = 0; i < 500000000; i++) {
        if (i == 0) {
          NSLog(@"串行同步任務(wù)%ld -> 開始%@",n,[NSThread currentThread]);
        }
        if (i == 499999999) {
          NSLog(@"串行同步任務(wù)%ld -> 完成",(long)n);
        }
      }
    });
  }
  NSLog(@"阻塞我沒有?當前線程%@",[NSThread currentThread]);
}

- (IBAction)serialAsync:(id)sender {
  NSLog(@"start log in main thread"]);
  dispatch_queue_t myQueue = dispatch_queue_create("myQueue", NULL);//創(chuàng)建一個串行隊列
  for (NSInteger n = 0; n < 3; n++) {
    dispatch_async(myQueue, ^{
      for (NSInteger i = 0; i < 500000000; i++) {
        if (i == 0) {
          NSLog(@"串行異步任務(wù)%ld -> 開始%@",n,[NSThread currentThread]);
        }
        if (i == 499999999) {
          NSLog(@"串行異步任務(wù)%ld -> 完成",(long)n);
        }
      }
    });
  }
  NSLog(@"阻塞我沒有?當前線程%@",[NSThread currentThread]);
}

- (IBAction)concurrentSync:(id)sender {
  NSLog(@"start log in main thread"]);
  dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
  for (NSInteger n = 0; n < 3; n++) {
    dispatch_sync(myQueue, ^{
      for (NSInteger i = 0; i < 500000000; i++) {
        if (i == 0) {
          NSLog(@"并行同步任務(wù)%ld -> 開始%@",(long)n,[NSThread currentThread]);
        }
        if (i == 499999999) {
          NSLog(@"并行同步任務(wù)%ld -> 完成",(long)n);
        }
      }
    });
  }

  NSLog(@"阻塞我沒有?當前線程%@",[NSThread currentThread]);
}
- (IBAction)concurrentAsync:(id)sender {
  NSLog(@"start log in main thread"]);
  dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
  for (NSInteger n = 0; n < 3; n++) {
    dispatch_async(myQueue, ^{
      for (NSInteger i = 0; i < 500000000; i++) {
        if (i == 0) {
          NSLog(@"并行異步任務(wù)%ld -> 開始%@",n,[NSThread currentThread]);
        }
        if (i == 499999999) {
          NSLog(@"并行異步任務(wù)%ld -> 完成",(long)n);
        }
      }
    });
  }
  NSLog(@"阻塞我沒有?當前線程%@",[NSThread currentThread]);
}

最后的結(jié)果如圖:

榪欓噷鍐欏浘鐗囨弿榪? title=

其中我把第一句打印和最后一句打印用玫紅色表示,它們都運行在當前線程。

方框表示隊列,3個block任務(wù)分別為3種不同的顏色。

可以看出:

串行即上一個block任務(wù)執(zhí)行完畢下一個任務(wù)才加入到隊列中。

并行即其中的任務(wù)同時加入到隊列中。

從運行結(jié)果來看

第一個圖只有一個主線程:

3個block都是同步即都阻塞當前線程,所以最后那句打印的任務(wù)就在3個block運行完之后。

3個block又是串行,所以一個一個運行

第二個圖有2個線程即一個主線程一個子線程:

3個block都是異步,沒有任務(wù)阻塞當前線程。所以最后那句打印是在第一句打印后就可以開始執(zhí)行的。

3個block都是異步,異步會創(chuàng)建新的線程即至少有一個子線程。

3個block是串行,只有一個任務(wù)做完才會加另一個任務(wù)入隊列,所以只需一個子線程。

第三個圖只有一個主線程:

3個block都是同步即都阻塞當前線程,所以最后那句打印的任務(wù)就在3個block運行完之后。

3個block是并行,同時被加入隊列中。

3個block都是同步,由于同步意味著等待,所以任務(wù)的執(zhí)行表現(xiàn)為順序執(zhí)行,其實是一起加進去的但是等待的,跟串行的區(qū)別是串行是別的任務(wù)做完才把它加進隊列中。

第四個圖有多個線程:

3個block都是異步,沒有任務(wù)阻塞當前線程。所以最后那句打印是在第一句打印后就可以開始執(zhí)行的。

3個block都是異步,異步會創(chuàng)建新的線程即至少有一個子線程。

3個block是并行,需創(chuàng)建多個子線程才能保證任務(wù)同時執(zhí)行。

再看一張圖:其中第一個異步為玫紅色,兩個同步分別以紫色黃色表示,兩個異步分別以綠色棕色表示,隊列后面的當前線程動作為橘色。虛線代表等待。上面代表串行,下面是并行。

榪欓噷鍐欏浘鐗囨弿榪? title=

由此圖可以看出:

同步block會阻塞當前線程,即會在當前線程中運行。(這里的當前線程為主線程所以會看到UI卡住)

異步block會開辟新的線程。

在串行隊列中,異步block任務(wù)用的是同一個子線程,因為需要等待任務(wù)一個一個地執(zhí)行,不需要多個線程。

在并行隊列中,異步block任務(wù)同時執(zhí)行,系統(tǒng)為其分配線程。圖中的例子因第一個異步操作在第二個開始前已經(jīng)結(jié)束了,所以并不是多少個異步操作就創(chuàng)建多少線程,主要還是看需要。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • C語言十進制轉(zhuǎn)二進制代碼實例

    C語言十進制轉(zhuǎn)二進制代碼實例

    這篇文章主要介紹了C語言十進制轉(zhuǎn)二進制代碼實例,并且轉(zhuǎn)換后會統(tǒng)計二進制1的個數(shù),實例簡單明了,需要的朋友可以參考下
    2014-06-06
  • 講解C語言編程中指針賦值的入門實例

    講解C語言編程中指針賦值的入門實例

    這篇文章主要介紹了講解C語言編程中指針賦值的入門實例,通過const int i與int *const pi這樣兩個例子來分析指針的賦值和地址指向,需要的朋友可以參考下
    2015-12-12
  • VC++中進程與多進程管理的方法詳解

    VC++中進程與多進程管理的方法詳解

    這篇文章主要介紹了VC++中進程與多進程管理的方法,以實例形式詳細分析了進程與多進程管理中所涉及的進程、子進程、進程的互斥運行與進程的結(jié)束等概念與具體實現(xiàn)方法,非常具有參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • win32下進程間通信(共享內(nèi)存)實例分析

    win32下進程間通信(共享內(nèi)存)實例分析

    這篇文章主要介紹了win32下進程間通信(共享內(nèi)存)實例分析,對win32應(yīng)用程序及進程的原理做了較為深入的剖析,需要的朋友可以參考下
    2014-07-07
  • 用C語言實現(xiàn)單鏈表的各種操作(一)

    用C語言實現(xiàn)單鏈表的各種操作(一)

    本篇文章是對用C語言實現(xiàn)單鏈表的各種操作進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • SublimeText編譯C開發(fā)環(huán)境設(shè)置

    SublimeText編譯C開發(fā)環(huán)境設(shè)置

    這篇文章主要介紹了使用SublimeText編譯C代碼的開發(fā)環(huán)境設(shè)置,大家參考使用
    2013-11-11
  • 嵌入式C程序優(yōu)質(zhì)編寫全面教程規(guī)范

    嵌入式C程序優(yōu)質(zhì)編寫全面教程規(guī)范

    這是一年前我為公司內(nèi)部寫的一個文檔,旨在向年輕的嵌入式軟件工程師們介紹如何在裸機環(huán)境下編寫優(yōu)質(zhì)嵌入式C程序。感覺是有一定的參考價值,所以拿出來分享,拋磚引玉
    2022-04-04
  • 探究C++中指針與數(shù)組運算符優(yōu)先級

    探究C++中指針與數(shù)組運算符優(yōu)先級

    C++中與指針和數(shù)組相關(guān)的運算符優(yōu)先級,通過實際代碼示例解釋了運算符的左結(jié)合與右結(jié)合方式,以及如何使用圓括號()來改變默認的結(jié)合順序,文章還提供了一個優(yōu)先級表,列出了運算符的優(yōu)先級和結(jié)合性,幫助讀者更好地理解復(fù)雜表達式中運算符的調(diào)用順序
    2024-10-10
  • 淺談C語言共用體和與結(jié)構(gòu)體的區(qū)別

    淺談C語言共用體和與結(jié)構(gòu)體的區(qū)別

    下面小編就為大家?guī)硪黄獪\談C語言共用體和與結(jié)構(gòu)體的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • opencv利用鼠標滑動畫出多彩的形狀

    opencv利用鼠標滑動畫出多彩的形狀

    這篇文章主要為大家詳細介紹了opencv利用鼠標滑動畫出多彩的形狀,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07

最新評論