目录
写在前面
并发编程,启动!
写在前面
计算机的并发指在单个系统里同时执行多个独立的任务。
在过去计算机内只有一个处理器时并发是通过快速的切换进程上下文所实现的,而现在计算机已经步入了多核并发时代,所以多个进程的并发实际上已经可以实现为多个进程的并行。
并发的方式有两种:
第一种是多进程的并发,多进程并发指的是将应用程序分为多个独立的进程同时运行。比如说网页浏览或者是文字处理,但是它的缺点非常明显:首先多个进程之间的通信比较困难即使使用了IPC通信机制,仍然需要消耗大量的系统资源。其次运行多个进程存在不必要的数据结构上的内存开销等。
所以现在的并发多是使用多线程并发,在多线程中进程中的所有线程都共享地址空间并且能够访问大部分的数据
我们为什么使用并发:无非两点!
-
首先我们可以分离程序的关注点,把程序下派到多个线程之间完成各个部分的任务,组合起来共同完成我们整体的任务。它可以使程序的抽象性更好!
-
其次是性能的问题,一些任务可以分派到不同的线程共同完成一个性质的任务,从而把大任务划分为小任务并行的完成,从而可以加快程序执行的速度。
那么什么时候并不去考虑使用并发呢?唯一的一个原因就是:收益是比不上成本的时候!
-
首先编写并发程序需要消耗大量的脑力,而且增加的复杂性也有可能诱发更多的错误!除非潜在的性能增益足够大或者说程序可以被分离得足够清晰,要不然使用并发的整体性能也许不如直接使用单线程!
-
其次还需要考虑系统资源是否可以使并发线程的优势更大,启动越多的线程,操作系统切换上下文可能就越频繁,导致程序流执行的效率可能就越低!(想象一下时间主要被用来切换上下文而不是用来执行任务)
并发编程,启动!
一个并发程序可能远远比你想象的要简单!
这是我们使用单线程来打印一个字符串时常用的一个程序,想必你应该很熟悉它!
#include <iostream> int main(){ std::cout << "Hello, World" << std::endl; }
多线程版本也很简单,如下
#include <iostream> #include <thread> // Here we import worker thread void sayHello(){ std::cout << "Hello!Programming in threads!" << std::endl; } int main() { std::thread t(sayHello); t.join(); }
确保你使用的C++版本在C++11及其以上
输出相当简单!在下一篇博客,我们将会重点介绍并发编程的若干细节。