1.3 C++中的并行和多线程

对于多线程并行的标准化支持对于C++来说是一个新东西。只有在C++11中你才可以写不依赖于系统扩展库的多线程程序。为了弄清新C++线程库,了解他的历史是很重要的。

1.3.1 C++多线程的历史

1998年C++标准没有意识到线程的存在,这导致许多的程序按照顺序的结构被编写。不仅仅如此,内存模型也没有标准定义,所以你离开指定编译器不能用1998C++写多线程程序.

当然,编译器厂商可以免费对语言添加扩展,而且多线程C API的流行-比如POSIX C标准和Microsoft Windows API-已经引领C++编译器厂商支持多线程的扩展,编译器支持通常只限于允许使用此平台的C API让C++运行库工作在多线程下。尽管很少有编译器提供正式的多线程内存模型,编译器和处理器已经可以很好的支持多线程的C++程序了。

不满足使用特定平台的C API 处理多线程。 C++ 程序员已经依赖他们的类库提供了面向对象的多线程支持,例如MFC程序框架和多用途的C++库,例如Boost和ACE已经封装了底层的API,提供更高级的简化任务的多线程工具。虽然类库多种多样,尤其是在启动新线程的时候,类的结构有很多相似。C++类库一个非常重要并且有利于程序员的设计,RAII(资源分配初始化)锁的使用确保当离开范围的时候互斥锁是打开的。

大多数情况下,编译器联合特定平台的API和跨平台的类库比如Boost和ACE为使用C++写多线程程序提供的坚实基础,但是标准的缺乏意味着缺乏线程感知的内存模型会引起问题,特别是对于想使用处理器提高程序性能或者编译器在各种平台间的跨平台性。

1.3.2 新标准的同步支持

所有的改变都是随着C++11的发布,不仅有了一个崭新的线程感知的内存模型,而且C++标准库已经包含了管理线程的类,带保护的共享数据,线程间同步,和底层原子操作。

新的C++线程库很大程度上是基于前面的C++类库。特别是,Boost线程库成为新类库最初的模型,许多类的名字和结构是Boost的升级版。由于新标准已经形成,这是一个双向的流动。boost类库在很多方面做了他自己的改变去适应新的C++标准,所以从Boost过度的用户应该发现很多相似的地方。

同步支持知识新标准的一个,语言上有许多加强的地方使程序员感觉写起来更容易。尽管这已经超出了本初的范畴,但是这些改变已经直接影响了线程库和它被使用的方式。附录A提供了一个对这些语言特性简洁的介绍。

原子操作的支持使程序员可以不使用平台指定扩展语言写出更加有效的程序,这是一个真正的高效可移植代码,编译器不仅要考平台,还要考虑优化操作,使程序最佳化

时间: 2024-10-31 02:21:15

1.3 C++中的并行和多线程的相关文章

5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq

在上一篇博客5天玩转C#并行和多线程编程 —— 第一天 认识Parallel中,我们学习了Parallel的用法.并行编程,本质上是多线程的编程,那么当多个线程同时处理一个任务的时候,必然会出现资源访问问题,及所谓的线程安全.就像现实中,我们开发项目,就是一个并行的例子,把不同的模块分给不同的人,同时进行,才能在短的时间内做出大的项目.如果大家都只管自己写自己的代码,写完后发现合并不到一起,那么这种并行就没有了意义. 并行算法的出现,随之而产生的也就有了并行集合,及线程安全集合:微软向的也算周到

5天玩转C#并行和多线程编程

5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task 5天玩转C#并行和多线程编程 —— 第四天 Task进阶 5天玩转C#并行和多线程编程 —— 第五天 多线程编程大总结 随着多核时代的到来,并行开发越来越展示出它的强大威力!使用并行程序,充分的利用系统资源,提高程序的性能.在.net 4.0中,微软给我们提供了

5天玩转C#并行和多线程编程 —— 第五天 多线程编程大总结

5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task 5天玩转C#并行和多线程编程 —— 第四天 Task进阶  一.多线程带来的问题 1.死锁问题  前面我们学习了Task的使用方法,其中Task的等待机制让我们瞬间爱上了它,但是如果我们在调用Task.WaitAll方法等待所有线程时,如果有一个Task一直不返

C#并行和多线程编程

5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task 5天玩转C#并行和多线程编程 —— 第四天 Task进阶 5天玩转C#并行和多线程编程 —— 第五天 多线程编程大总结 在上一篇博客5天玩转C#并行和多线程编程 —— 第一天 认识Parallel

5天玩转C#并行和多线程编程 —— 第四天 Task进阶

5天玩转C#并行和多线程编程系列文章目录,前三天的目录,最后一篇更新完会附上完整目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task  一.Task的嵌套 Task中还可以再嵌套Task,Thread中能不能这样做,我只能说我是没这样写过.Task中的嵌套,我感觉其实也可以分开来写,不过嵌套起来会方便管理一点.Task中的嵌套分为两种,关联嵌套和非关

ios中的几种多线程实现

iOS 支持多个层次的多线程编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法.下面根据抽象层次从低到高依次列出iOS所支持的多线程编程范式:1, Thread;2, Cocoa operations;3, Grand Central Dispatch (GCD) (iOS4 才开始支持)下面简要说明这三种不同范式:Thread 是这三种范式里面相对轻量级的,但也是使用起来最负责的,你需要自己管理thread的生命周期,线程之间的同步.线程共享同一应用程序的部分内存空间,它

C#中利用委托实现多线程跨线程操作

在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便. 其实解决这个问题有两种方法:一,是通过设置System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;在你的程序初始化的时候设置了这个属性,而且在你的控件中使用的都是微软Framework类库中的控件的话,系统就不会再抛出你上面所说的

Linux中查看进程的多线程pstree, ps -L

Linux中查看进程的多线程 在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢? 本文介绍3种命令来查看Linux系统中的线程(LWP)的情况:在我的系统中,用qemu-system-x86_64命令启动了一个SMP的Guest,所以有几个qemu的线程,以此为例来说明. 1. pstree 命令,查看进程和线程的树形结构关系.  BASH 1 2 3 4 5 [root@jay-linux ~]# pstree | grep qemu |-gn

boost中asio网络库多线程并发处理实现,以及asio在多线程模型中线程的调度情况和线程安全。

1.实现多线程方法: 其实就是多个线程同时调用io_service::run for (int i = 0; i != m_nThreads; ++i)        {            boost::shared_ptr<boost::thread> pTh(new boost::thread(                boost::bind(&boost::asio::io_service::run,&m_ioService)));            m_l