并发编程(1)简介

一 、多进程并发和多线程并发

  多进程并发有进程间通信机制,更加安全。第一个缺点:进程间通信为避免一个进程修改另一个进程,比如读时共享写时复制使得花销更大;第二个缺点:需要启动进程,还要系统内核来管理进程,因为C++ 没有对进程提供任何封装。

  但是进程相对独立,可以分布式运行在独立的机器上,算是一个优点。

  多线程共享内存,但是程序员要确保访问到的数据线程一致性。

二、并发的意义

  分离关注点和提高性能。

  1、 分离关注点:就想QT里面将图像处理函数交给线程,主控线程关注用户输入,等待接收线程返回。防止页面卡死。

 2、 提高性能:那是肯定。

  两种方式利用并发提高性能:

   第一,将一个单个任务分成几部分,且各自并行运行,从而降低总运行时间。这就是任务并行(task parallelism)。虽然这听起来很直观,但它是一个相当复杂的过程,因为在各个部分之间可能存在着依赖。区别可能是在过程方面:一个线程执行算法的一部分,而另一个线程执行算法的另一个部分或是在数据方面;不是所有算法都是易并行算法。

 第二,每个线程在不同的数据部分上执行相同的操作,对数据的并行处理,称为数据并行。

 但是,创建线程,线程要独立的栈空间,创建太多线程会消耗操作系统资源。一般每个线程会有10MB空间。每个进程4G也只能有4096个,此时其他3区将没有任何空间,而且堆的要求空间远远大于栈。可以使用线程池技术,但是线程池创建也是一个动态的管理技术,也要占用资源。所以,小任务不要用线程,也不要创建太多线程。

三、多进程是系统调用,多线程是函数库(C++11)
四、多线程一个例子:
#include
#include //①
void hello() //②
{
std::cout << "Hello Concurrent World ";
}
int main()
{
std::thread t(hello); //③
t.join(); //④
}
在 std::thread 对象的构造函数中指定——本例中,被命名为t。t 对象拥有新函数hello()作为其初始函数。如果不加join,那么主控线程会自己继续运行结束,可能在hello之前也可能在之后。加入join会阻塞等待t对象返回。(join,cancle,exit三个线程结束函数的区别)

原文地址:https://www.cnblogs.com/huangfuyuan/p/9125582.html