欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++ 并发(1)

程序员文章站 2024-03-12 15:07:08
...

计算机的并发是值在单个系统里同时执行多个独立的任务,而不是顺序执行

对于只有一个处理器的计算机,它只能在某一时刻执行一个任务。但却可以通过多次的任务切换,让任务看上去像是并行执行的,正因为任务切换太快,以至于无法感觉到任务在何时被挂起。但系统每次从一个任务切换到另一个时都要进行上下文切换,操作系统必须为当前运行的任务保存CPU的状态和指令指针,并计算出要切换到哪一个任务并为即将切换到的任务重新加载处理器状态。这个过程会造成延迟

而对于有多个处理器的机器而言,每个任务可以在各自的处理器上执行。

如图:

C++ 并发(1)

并发的方式:

1   分为多个独立的进程,独立的进程可以通过进程间常规的通信渠道传递讯息(信号,套接字,文件,管道,共享内存,消息队列)。

缺点是

速度慢:因为操作系统会在进程间提供保护措施,避免一个进程去修改另一个进程的数据

运行多个进程所需的固定开销,需要时间启动进程,操作系统需要内部资源来管理进程。

 

优点是

可以更容易编写安全的并发代码

C++ 并发(1)

2 在单个进程中运行多个线程。线程很像轻量级的进程,每个线程都互相独立运行。但是!!进程中的所有线程都共享地址空间,且所有线程能访问到大部分数据(全局变量依然全局,指针和对象的引用或数据可以在线程之间传递。

C++ 并发(1)

使用多线程的开销远远小于使用多进程,因为地址空间共享,以及缺少线程间数据的保护。使得操作系统的记录工作量减少

但需要注意的是,因为数据要被多个线程访问,那么程序员必须保证每个线程访问到的数据是一致的(例如单例模式的多线程安全问题)

 

一个简单的多线程例子:

#include <iostream>
#include <thread>
void hello()
{
        std::cout<<"hello"<<std::endl;
}
int main()
{
        std::thread t(hello);
        t.join();
}

 

初始线程开始于main(),新线程开始于hello()

新线程启动后,初始线程继续执行,如果它不等待新线程结束,它就将继续运行到main()结束,从而结束程序。而这时有可能新进程还没有运行结束,所以要调用join()函数