最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

線程:線程是進(jìn)程的最小單位。一個(gè)進(jìn)程里至少有一個(gè)主線程。就是那個(gè)main thread。非常簡(jiǎn)單的app可能只需要一個(gè)主線程即UI線程。當(dāng)然大部分還是會(huì)有一些子線程的,比如如果你用了AFNetWorking,你的請(qǐng)求都是開(kāi)辟了子線程。

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

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

- (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 -> 開(kāi)始%@",n,[NSThread currentThread]);
        }
        if (i == 499999999) {
          NSLog(@"串行同步任務(wù)%ld -> 完成",(long)n);
        }
      }
    });
  }
  NSLog(@"阻塞我沒(méi)有?當(dāng)前線程%@",[NSThread currentThread]);
}

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

  NSLog(@"阻塞我沒(méi)有?當(dāng)前線程%@",[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 -> 開(kāi)始%@",n,[NSThread currentThread]);
        }
        if (i == 499999999) {
          NSLog(@"并行異步任務(wù)%ld -> 完成",(long)n);
        }
      }
    });
  }
  NSLog(@"阻塞我沒(méi)有?當(dāng)前線程%@",[NSThread currentThread]);
}

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

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

其中我把第一句打印和最后一句打印用玫紅色表示,它們都運(yùn)行在當(dāng)前線程。

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

可以看出:

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

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

從運(yùn)行結(jié)果來(lái)看

第一個(gè)圖只有一個(gè)主線程:

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

3個(gè)block又是串行,所以一個(gè)一個(gè)運(yùn)行

第二個(gè)圖有2個(gè)線程即一個(gè)主線程一個(gè)子線程:

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

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

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

第三個(gè)圖只有一個(gè)主線程:

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

3個(gè)block是并行,同時(shí)被加入隊(duì)列中。

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

第四個(gè)圖有多個(gè)線程:

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

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

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

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

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

由此圖可以看出:

同步block會(huì)阻塞當(dāng)前線程,即會(huì)在當(dāng)前線程中運(yùn)行。(這里的當(dāng)前線程為主線程所以會(huì)看到UI卡?。?/p>

異步block會(huì)開(kāi)辟新的線程。

在串行隊(duì)列中,異步block任務(wù)用的是同一個(gè)子線程,因?yàn)樾枰却蝿?wù)一個(gè)一個(gè)地執(zhí)行,不需要多個(gè)線程。

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

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

相關(guān)文章

  • 使用C++實(shí)現(xiàn)簡(jiǎn)單的文章生成器

    使用C++實(shí)現(xiàn)簡(jiǎn)單的文章生成器

    這篇文章主要為大家詳細(xì)介紹了鵝湖使用C++實(shí)現(xiàn)簡(jiǎn)單的狗屁不通文章生成器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解下
    2024-03-03
  • C++?超詳細(xì)梳理繼承的概念與使用

    C++?超詳細(xì)梳理繼承的概念與使用

    這篇文章主要介紹了C++?多繼承詳情,C++支持多繼承,即允許一個(gè)類同時(shí)繼承多個(gè)類。只有C++等少數(shù)語(yǔ)言支持多繼承,下面我們就來(lái)看看具體的多繼承介紹吧,需要的朋友可以參考一下
    2022-03-03
  • C語(yǔ)言的函數(shù)概念與規(guī)則你了解嗎

    C語(yǔ)言的函數(shù)概念與規(guī)則你了解嗎

    這篇文章主要介紹了C語(yǔ)言中的函數(shù)概念與規(guī)則,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-08-08
  • VC++基于Dx實(shí)現(xiàn)的截圖程序示例代碼

    VC++基于Dx實(shí)現(xiàn)的截圖程序示例代碼

    這篇文章主要介紹了VC++基于Dx實(shí)現(xiàn)的截圖程序示例代碼,比較實(shí)用的功能,需要的朋友可以參考下
    2014-07-07
  • C語(yǔ)言函數(shù)棧幀解析

    C語(yǔ)言函數(shù)棧幀解析

    下面小編就為大家?guī)?lái)一篇淺談C語(yǔ)言函數(shù)調(diào)用參數(shù)壓棧的相關(guān)問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-09-09
  • 詳解C++ 編寫(xiě)String 的構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值函數(shù)

    詳解C++ 編寫(xiě)String 的構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值函數(shù)

    這篇文章主要介紹了詳解C++ 編寫(xiě)String 的構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值函數(shù)的相關(guān)資料,這里提供實(shí)例幫助大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • 詳解Matlab中自帶的Java操作合集

    詳解Matlab中自帶的Java操作合集

    其實(shí)Matlab中也有一些自帶的Java操作,例如:獲取鼠標(biāo)在全屏位置、獲取當(dāng)前剪切板內(nèi)容、獲取鼠標(biāo)處像素顏色等,本文總結(jié)了七個(gè)這樣的操作,感興趣的可以了解一下
    2022-03-03
  • C語(yǔ)言整形提升舉例詳解

    C語(yǔ)言整形提升舉例詳解

    對(duì)于整形提升,高位需要補(bǔ)位,那么補(bǔ)什么呢,無(wú)符號(hào)數(shù)高位補(bǔ)0,有符號(hào)數(shù)高位補(bǔ)1,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言整形提升的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 詳解C語(yǔ)言中的自定義類型

    詳解C語(yǔ)言中的自定義類型

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中的四大自定義類型(結(jié)構(gòu)體、位段、枚舉和聯(lián)合)的相關(guān)知識(shí),文中的示例代碼簡(jiǎn)潔易懂,需要的可以參考一下
    2023-07-07
  • 基于C語(yǔ)言實(shí)現(xiàn)創(chuàng)意多彩貪吃蛇游戲

    基于C語(yǔ)言實(shí)現(xiàn)創(chuàng)意多彩貪吃蛇游戲

    這篇文章主要介紹了如何利用C語(yǔ)言實(shí)現(xiàn)一個(gè)創(chuàng)意多彩貪吃蛇游戲,這是一個(gè)純C語(yǔ)言外加easyx庫(kù)的繪圖函數(shù)制作而成的有趣小游戲,無(wú)需引入額外資源,感興趣的可以動(dòng)手嘗試一下
    2022-08-08

最新評(píng)論

迁西县| 康乐县| 遵义县| 林州市| 棋牌| 天镇县| 永靖县| 桑植县| 肥东县| 海宁市| 察哈| 筠连县| 赤峰市| 东源县| 天长市| 施甸县| 漳浦县| 高唐县| 靖远县| 青冈县| 邹平县| 长岛县| 德庆县| 乌苏市| 乐平市| 贺州市| 荔波县| 贵德县| 普洱| 东乡县| 青川县| 长治市| 泸西县| 江油市| 福贡县| 曲水县| 沅江市| 舟山市| 屏边| 青川县| 二连浩特市|