1.c++并发概念及入门小例子

最近在学C++并发,做为一个学习知识追求效率,对所学新概念又力求通俗易懂的我来讲,该写点东西来做笔记,以便之后的复习。 做为一名新手,笔记中不免会有错误的地方,但愿路过的大神有错的话请指出错误,我会更正,谢谢。 进入正题。 首先学并发以前要了解什么是并发?什么是并行? 我我的的观点是:并发强调的是单个CPU可以同时处理多个不一样的事件的能力(这里所谓的同时是在宏观上的同时,但精确到某一时刻在微观上CPU只执行多个任务中某个任务的一个小切片,而后不断的经过上下文切换实现多任务的交替处理,从而在宏观上让人感受是同时可以处理多任务的感受),好比事件A,B,在1s的间隔之间它花0.5s完成执行A的一部分,接着切换一下任务,在接下来的0.5s执行B的一部分,而后在日后的每1s时间间隔内继续重复执行A,B的部分代码及任务的切换,若是没有并发对于要处理的事件CPU只能一件一件的来处理,例如先完成A再完成B;而并行强调的是不一样的事件分别经过多个CPU来同时处理,例如事件A,B,事件A在CPU1上执行,事件2在CPU2上执行,它们之间互不干扰,从而达到快速处理的目的。 乍看之下发现并行貌似要比并发好,那为何还使用并发呢?一个运行中的程序就是一个进程,打开电脑查看一下,发现电脑的运行的进程数目要远大于CPU的核心数,因此要完成各个任务处理器只能经过并发来执行啦。 从C++11开始,C++提供相应的库来支持多线程的开发。 如同c语言要使用printf()函数来打印输出同样,首先要把头文件包含进来。 要编写多线程程序,在C++程序中就要包含相应的库来建立线程。 写程序以前聊聊线程,线程是在进程内构成单独执行流的单位,进程内的每一个线程都有单独的栈区域!全部的线程都共享数据区和堆区!!! 下面编写第一个多线程hello world的例子。ios

建立文件名为hello.cc的文件,输入:c++

#include<iostream> 多线程

#include<thread> //用于管理线程的函数和类在这个库中并发

using namespace std; void hello() { cout<<"Hello World!"<<endl; }函数

int main() { std::thread my_th1(hello);//线程建立时必须加入可调用类型做为函数入口,这里hello()函数做为线程建立成功后执行的函数学习

my_th1.join();spa

return 0;操作系统

}线程

完成后使用:进程

g++ hello.cc -o hello -std=c++0x -pthread编译时要加入-pthread的参数,这样才能正确的编译。

程序运行,输出结果以下:

Hello World!

这里有些要注意的地方:一个进程执行以后会有一个主线程,这里是main主线程,要想建立其余线程,就在main主线程中建立,这里建立my_th1线程。 建立成功后,main主线程和my_th1线程在CPU上并发运行,它们共享数据区和堆。 join()的做用是,main主线程建立my_th1线程后,若是my_th1干的活不少而主线程的活干完了,它会等my_th1这个线程干完活了才结束,而后通知操做系统回内存。 若是不join() my_th1线程的话,main主线程执行完了,这时它会本着死道友不死贫道的精神通知对操做系统回收内存,无论my_th1线程是否干完活,操做系统都会回收内存,那些共享数据区和堆啊都会被回收,若是恰好my_th1线程的活没干完,my_th1线程会在一段被回收的内存上进行操做,程序会引起错误。

相关文章
相关标签/搜索