注:本文内容摘自:《C++并发编程实战》——Anthony Williams著 周全等译
自己将其中的精华内容摘抄出来,做以笔记,加深印象与理解!
1.1何谓并发:
最简单和最基本的并发,是指两个或更多独立的活动同时发生。
1.1.1 计算机系统中的并发:
计算机领域的并发指的是在单个系统里同时执行多个独立的任务,而非顺序的进行一些活动。
1.1.2并发的表现:
单核处理器:通过任务调度(切换)实现伪并发
多核处理器:通过硬件支持达到真正的并发效果(单个芯片,内嵌多个处理器)
1.2 使用并发的原因:
1、关注点分离
2、提高性能
1.2.1利用并发提高性能的两种方式:
1、任务并行(*taskparallelism*)or数据并行(*data parallelism*):
任务并行是将一个单个任务分成几部分,且各自并行运行,从而降低总运行时间。
数据并行是每个线程在不同的数据部分上执行相同的操作;
2、使用可用的并发方式来解决更大的问题。
1.2.3 什么时候不使用并发
收益<成本
成本:
1、 编写、维护方面的脑力成本;
2、 复杂性可能会引来的更多的错误;
3、 性能增益可能会小于预期;
4、 线程占用堆栈空间,所以运行太多的线程也会耗尽进程的可用内存或地址空间。对于一个可用地址空间为4GB(32bit)的平坦架构的进程来说,如果每个线程都有一个1MB的堆栈(很多系统都会这样分配),那么4096个线程将会用尽所有地址空间,不会给代码、静态数据或者堆数据留有任何空间。
5、 运行越多的线程,操作系统就需要做越多的上下文切换,每个上下文切换都需要耗费本可以花在有价值工作上的时间。
1.3在c++中使用并发:
1.3.1 RAII(Resource Acquisition IsInitialization)-资源获得即初始化:
许多C++类库(如:MFC、Boost、ACE等c++通用类库)共有的,同时也是为程序员提供很大便利的特别重要的一种设计,用来确保退出相关作用域的时候互斥元被解锁。
1.3.2 C++11新标准的变化:
1、对并发的支持;
2、编程语言自身的改善;
3、全面的原子操作库;
4、更高级别的抽象和工具…
1.4一个简单的C++并发例子:
#include"stdafx.h"
#include<iostream>
#include<thread>
void hello(){
std::cout<< "Hello World";
}
int main()//原始线程
{
std::threadt(hello);//新的线程t,并制定该线程的入口函数为hello
t.join();
return 0;
}
几点解释:
1、<thread>:用于管理线程的函数和类的头文件
2、main()函数:整个应用程序的入口函数,也是初始线程(调用线程:main线程在代码中调用新线程,如调用std::thread t(hello););
3、std::thread t(hello):main函数中新创建的线程;
4、hello()函数:每一个线程必须有一个初始函数,该初始函数即使t线程的初始函数
5、t.jion():这个语句的执行将会导致调用线程(在main()函数中)等待与std::thread对象相关联的线程,即该例子中的t线程。