《C++并发编程》《初识C++并发》
一、基础概念介绍
1.1什么是并发
并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
1.2什么是并行
当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
区别:
并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。倘若在计算机系统中有多个处理机,则这些可以并发执行的程序便可被分配到多个处理机上,实现并行执行,即利用每个处理机来处理一个可并发执行的程序,这样,多个程序便可以同时执行。
1.3多进程并发与多线程并发
多进程并发:
多进程并发是指在同一时间段内,同时运行多个进程,以实现并发执行。在多进程并发中,每个进程都有自己的地址空间和资源,并且可以独立地执行任务。
多进程并发通常用于处理多个独立的、相互之间没有直接关联的任务,这些任务可以并行执行,以提高程序的执行效率。
在多进程并发中,需要使用进程创建和管理函数来创建新的进程,并且需要使用进程间通信(IPC)机制来实现进程之间的数据共享和协调。常见的进程间通信机制包括管道、消息队列、共享内存、信号量等。
多线程并发:
多线程并发是指在同一程序中同时执行多个线程,以实现并发执行。与多进程并发相比,多线程并发具有更高的资源共享性和灵活性,因为多个线程可以共享同一个进程的地址空间和资源。
在多线程并发中,每个线程可以独立执行不同的任务,这些任务可以是进程内的一部分,也可以是整个进程。多线程并发适用于同时执行多个相互之间有一定关联的任务,以提高程序的执行效率。
二、为什么要使用并发技术
2.1为分离关注点而并发
1、模块化设计:并发技术可以将程序划分为独立的模块,每个模块负责不同的任务,这样可以使程序结构更清晰,方便维护和扩展。
2、资源隔离:并发技术可以有效地隔离资源,防止资源冲突和竞争,保证程序的稳定性和可靠性。
3、解耦设计:并发技术可以将程序中的各个模块解耦,减少模块之间的依赖关系,提高程序的灵活性和可扩展性。
优化性能:并发技术可以充分利用系统资源,提高程序的性能和效率。例如,多线程技术可以同时执行多个任务,减少等待时间,提高程序的响应速度。
2.2为提升性能而并发
1、使用线程库:C++标准库提供了线程库,其中包含创建和管理线程的类和函数。可以使用这些类和函数来创建和管理多个线程,将任务分配给不同的线程并发执行。
2、任务分解:将任务分解为多个独立的子任务,并为每个子任务创建一个线程。这样可以充分利用多核处理器或多处理器系统的优势,提高程序的并行度和执行效率。
3、数据并行:如果程序中有大量数据需要处理,可以考虑使用数据并行的方式将数据划分为多个块,并为每个块创建一个线程进行处理。这样可以充分利用多核处理器或多处理器系统的优势,提高数据处理的速度。
4、线程同步:在多线程编程中,需要确保线程之间的同步和协调。可以使用互斥锁、条件变量、信号量等机制来避免线程之间的竞争和冲突,保证程序的正确性和性能。
5、线程池:使用线程池可以避免频繁创建和销毁线程的开销,提高程序的性能。可以使用线程池类或函数来创建和管理一个线程池,将任务分配给不同的线程并发执行。
6、异步编程:使用异步编程可以避免阻塞主线程的执行,提高程序的响应性和性能。可以使用异步函数和相关类来处理异步操作,将耗时的操作交给后台线程执行。
三、简单示例
#include<iostream>
#include<thread>
void hello(){
std::cout<<"hello concurrent world!\n";
}
int main(){
std::thread t(hello);
t.join();
}
四、总结
书山有路勤为径,学海无涯苦作舟。
五、参考连接
《C++并发编程实战(第二版)》
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!