C++11标准在标准库中为多线程提供了组件。ios
并发:编程
并发指的是两个或多个独立的活动在同一时段内发生。同一时间段内能够交替处理多个操做。一个CPU交替处理多个任务,存在竞争关系,在逻辑上表现为一个时段内同时处理多个任务。promise
并行:安全
并行就是同时执行,计算机在同一时刻,在某个时间点上处理两个或以上的操做。判断一个程序是否并行执行,只须要看某个时刻上是否多两个或以上的工做单位在运行。一个程序若是是单线程的,那么它没法并行地运行。利用多线程与多进程能够使得计算机并行地处理程序(固然 ,前提是该计算机有多个处理核心)。在物理上表现为一个时段内同时处理多个任务。多线程
并发重点指的是程序的设计结构,而并行指的是程序运行的状态。并发编程,是一种将一个程序分解成小片断独立执行的程序设计方法。并发
并发的基本方式途径
多线程与多进程是并发的两种途径。ide
多进程并发
多个进程独立地运行,它们之间经过进程间常规的通讯渠道传递讯息(信号,套接字,文件,管道等),这种进程间通讯不是设置复杂就是速度慢,这是由于为了不一个进程去修改另外一个进程,操做系统在进程间提供了必定的保护措施,固然,这也使得编写安全的并发代码更容易。
运行多个进程也须要固定的开销:进程的启动时间,进程管理的资源消耗。函数
多线程并发
在当个进程中运行多个线程也能够并发。线程就像轻量级的进程,每一个线程相互独立运行,但它们共享地址空间,全部线程访问到的大部分数据如指针、对象引用或其余数据能够在线程之间进行传递,它们均可以访问全局变量。线程之间一般共享内存,但这种共享一般难以创建且难以管理,缺乏线程间数据的保护。所以,在多线程编程中,咱们必须确保每一个线程锁访问到的数据是一致的。this
C++中的并发与多线程
C++标准并无提供对多进程并发的原生支持,因此C++的多进程并发要靠其余API——这须要依赖相关平台。
C++11 标准提供了一个新的线程库,内容包括了管理线程、保护共享数据、线程间的同步操做、低级原子操做等各类类。标准极大地提升了程序的可移植性,之前的多线程依赖于具体的平台,而如今有了统一的接口进行实现。atom
C++11 新标准中引入了几个头文件来支持多线程编程:
< thread > :包含std::thread类以及std::this_thread命名空间。管理线程的函数和类在其中声明。
< atomic > :包含std::atomic和std::atomic_flag类,以及一套C风格的原子类型和与C兼容的原子操做的函数。
< mutex > :包含了与互斥量相关的类以及其余类型和函数。
< future > :包含两个Provider类(std::promise和std::package_task)和两个Future类(std::future和std::shared_future)以及相关的类型和函数。
< condition_variable > :包含与条件变量相关的类,包括std::condition_variable和std::condition_variable_any。
开线程
单线程时:
1 # include<iostream> 2 using namespace std; 3 int main() 4 { 5 cout<<"hello world"<<endl; 6 }
在这里,进行由一个线程组成,该线程的初始函数是main。咱们启动第二个线程来打印hello world:
1 # include<iostream> 2 # include<thread> 3 using namespace std; 4 void hello() 5 { 6 cout<<"hello world"<<endl; 7 } 8 int main() 9 { 10 thread t (hello); 11 t.join(); 12 }
每一个线程都必须有一个初始函数,新线程的执行开始于初始函数。对于第一段程序来讲,它的初始函数是main,对于咱们新建立的线程,能够在std::thread()对象的构造函数中指定。在第二段程序里,程序由两个线程组成:初始线程始于main,新线程始于hello。这里将新线程t的初始函数指定为hello。
新线程启动以后会与初始进程一并运行,初始线程能够等待或不等待新进程的运行结束——若是须要等待线程,则新线程实例须要使用join(),不然能够使用detach()。若是不等待新线程,则初始线程自顾自地运行到main()结束。