全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++  线程(串行 并行 同步 异步)详解

C++  线程(串行 并行 同步 异步)详解

看了很多关于这类的文章,一直没有总结。不总结的话就会一直糊里糊涂,以下描述都是自己理解的非官方语言,不一定严谨,可当作参考。

首先,进程可理解成一个可执行文件的执行过程。在ios app上的话我们可以理解为我们的app的.ipa文件执行过程也即app运行过程。杀掉app进程就杀掉了这个app在系统里运行所占的内存。

线程:线程是进程的最小单位。一个进程里至少有一个主线程。就是那个main thread。非常简单的app可能只需要一个主线程即UI线程。当然大部分还是会有一些子线程的,比如如果你用了AFNetWorking,你的请求都是开辟了子线程。

关于串行,并行,同步,异步,我还是以下面代码的方式做个说明。

首先button点击事件运行在主线程里,先是在主线程里做了打印了一句话,然后创建了一个串行或者并行的队列,之后连续创建了3个同步或者异步的block任务放入此队列中,最后再在主线程里打印一句话。

- (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(@"串行同步任务%ld -> 开始%@",n,[NSThread currentThread]);
        }
        if (i == 499999999) {
          NSLog(@"串行同步任务%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);//创建一个串行队列
  for (NSInteger n = 0; n < 3; n++) {
    dispatch_async(myQueue, ^{
      for (NSInteger i = 0; i < 500000000; i++) {
        if (i == 0) {
          NSLog(@"串行异步任务%ld -> 开始%@",n,[NSThread currentThread]);
        }
        if (i == 499999999) {
          NSLog(@"串行异步任务%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(@"并行同步任务%ld -> 开始%@",(long)n,[NSThread currentThread]);
        }
        if (i == 499999999) {
          NSLog(@"并行同步任务%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(@"并行异步任务%ld -> 开始%@",n,[NSThread currentThread]);
        }
        if (i == 499999999) {
          NSLog(@"并行异步任务%ld -> 完成",(long)n);
        }
      }
    });
  }
  NSLog(@"阻塞我没有?当前线程%@",[NSThread currentThread]);
}

最后的结果如图:

其中我把第一句打印和最后一句打印用玫红色表示,它们都运行在当前线程。

方框表示队列,3个block任务分别为3种不同的颜色。

可以看出:

串行即上一个block任务执行完毕下一个任务才加入到队列中。

并行即其中的任务同时加入到队列中。

从运行结果来看

第一个图只有一个主线程:

3个block都是同步即都阻塞当前线程,所以最后那句打印的任务就在3个block运行完之后。

3个block又是串行,所以一个一个运行

第二个图有2个线程即一个主线程一个子线程:

3个block都是异步,没有任务阻塞当前线程。所以最后那句打印是在第一句打印后就可以开始执行的。

3个block都是异步,异步会创建新的线程即至少有一个子线程。

3个block是串行,只有一个任务做完才会加另一个任务入队列,所以只需一个子线程。

第三个图只有一个主线程:

3个block都是同步即都阻塞当前线程,所以最后那句打印的任务就在3个block运行完之后。

3个block是并行,同时被加入队列中。

3个block都是同步,由于同步意味着等待,所以任务的执行表现为顺序执行,其实是一起加进去的但是等待的,跟串行的区别是串行是别的任务做完才把它加进队列中。

第四个图有多个线程:

3个block都是异步,没有任务阻塞当前线程。所以最后那句打印是在第一句打印后就可以开始执行的。

3个block都是异步,异步会创建新的线程即至少有一个子线程。

3个block是并行,需创建多个子线程才能保证任务同时执行。

再看一张图:其中第一个异步为玫红色,两个同步分别以紫色黄色表示,两个异步分别以绿色棕色表示,队列后面的当前线程动作为橘色。虚线代表等待。上面代表串行,下面是并行。

由此图可以看出:

同步block会阻塞当前线程,即会在当前线程中运行。(这里的当前线程为主线程所以会看到UI卡住)

异步block会开辟新的线程。

在串行队列中,异步block任务用的是同一个子线程,因为需要等待任务一个一个地执行,不需要多个线程。

在并行队列中,异步block任务同时执行,系统为其分配线程。图中的例子因第一个异步操作在第二个开始前已经结束了,所以并不是多少个异步操作就创建多少线程,主要还是看需要。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C++  # 线程(串行  # 并行  # 同步  # 异步)  # 线程异步  # C++中的并行与并发基础与使用详解  # C++实现并行计算的两种方式  # 都是  # 一句  # 是在  # 第一个  # 多个  # 那句  # 只有一个  # 有一  # 就在  # 第二个  # 可以看出  # 句话  # 做完  # 就可以  # 的是  # 就会  # 如果你  # 会有  # 我还  # 看了 


相关文章: 建站主机如何选?性能与价格怎样平衡?  建站VPS能否同时实现高效与安全翻墙?  浅谈Javascript中的Label语句  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何用低价快速搭建高质量网站?  建站之星2.7模板:企业网站建设与h5定制设计专题  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  专业网站建设制作报价,网页设计制作要考什么证?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  定制建站如何定义?其核心优势是什么?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  ,怎么在广州志愿者网站注册?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  公司网站的制作公司,企业网站制作基本流程有哪些?  如何快速搭建响应式可视化网站?  招贴海报怎么做,什么是海报招贴?  如何在建站宝盒中设置产品搜索功能?  平台云上自主建站:模板化设计与智能工具打造高效网站  建站之星上传入口如何快速找到?  如何挑选高效建站主机与优质域名?  如何安全更换建站之星模板并保留数据?  广东企业建站网站优化与SEO营销核心策略指南  建站主机类型有哪些?如何正确选型  建站主机核心功能解析:服务器选择与网站搭建流程指南  建站之星CMS五站合一模板配置与SEO优化指南  制作网站外包平台,自动化接单网站有哪些?  用v-html解决Vue.js渲染中html标签不被解析的问题  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  如何用西部建站助手快速创建专业网站?  如何快速生成专业多端适配建站电话?  如何选择域名并搭建高效网站?  宝塔建站无法访问?如何排查配置与端口问题?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  如何用搬瓦工VPS快速搭建个人网站?  焦点电影公司作品,电影焦点结局是什么?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  如何零基础在云服务器搭建WordPress站点?  如何快速搭建FTP站点实现文件共享?  如何通过主机屋免费建站教程十分钟搭建网站?  建站主机选购指南:核心配置优化与品牌推荐方案  如何在万网主机上快速搭建网站?  兔展官网 在线制作,怎样制作微信请帖?  建站之星备案流程有哪些注意事项?  如何快速搭建二级域名独立网站?  广州营销型建站服务商推荐:技术优势与SEO优化解析  宁波免费建站如何选择可靠模板与平台? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。