C++11多线程与并发初探
现在计算机技术领域,实现并发程序已经成为所有C++程序员的必备技能。随着程序越来越复杂,并发的应用越来越多。今天我们就来了解下C++11多线程和并发实现。
什么是并发(concurrency)?
并发指应用能够交替执行不同的任务。当多个程序在相互通信时同时运行时,就会发生并发,这个过程是由多个不同的线程执行的。并发不是同时执行多个任务,而是同一时间段内发生了多件事情,但是因为完成的非常快速,看起来像是同时发生。
C++并发性的历史
并发在C++中第一次被引入是在C++ 11的标准中,C++11并发包括线程、C++内存模型、条件变量、互斥等等。C++ 11标准与C++ 17的标准发生了巨大的变化。在C++17版本的标准模板库(STL)中加入了并行算法,大大提高了并发代码的性能。
并发(Concurrency)与并行(parallelism)
并发性和并行性常常混淆在一起,但理解两者之间的区别很重要。
并发:指应用能够交替执行不同的任务。
两者区别:一个是交替执行,一个是同时执行。
在C++中,实现并发最常见的两种方法是多线程和并行。虽然这些可以用于其他编程语言,但C++的并发优点更多,首先C++比其他编程语言拥有更低的平均开销,其次C++具备实现复杂指令的能力。
下面,我们将探讨C++编程中的并发编程和多线程。
C++多线程
C++多线程涉及创建和使用线程对象(比如使用std::thread来创建线程对象)来独立执行委托的子任务。在创建线程时,将向线程传递一个要完成的函数,并可选的为该函数传递参数。
虽然每个单独的线程可能一次只完成一个功能,但线程池允许我们回收和重用线程对象,从而给程序带来了无限多任务的错觉。这不仅利用了多个CPU内核,而且还允许开发人员通过操作线程池大小来控制执行的任务数。这样可以确保程序有效地使用计算机资源,而不会导致系统过载。
C++11多线程创建方法
在每个C++应用程序中,都有一个主线程(main函数)。在C++11标准中,创建线程可以通过类std::thread来创建。该类需要包含头文件:
#include <thread>
初始化std::thread类对象,有三种参数传递方式:
函数指针
类对象
lambda表达式
例如,可以这样创建线程对象:
std::thread thObj(<CALLBACK>);
线程对象创建后,就可以并行地执行传递的回调函数。
如果在退出前,想等待所有线程结束再退出,可以使用join()函数。
1. 使用函数指针创建线程
2. 使用类对象创建线程
3. 使用lambda表示创建线程
线程在运行过程中,如果区分线程呢?
每个线程都有自己的线程ID,通过std::thread创建的线程可以使用std::thread::get_id()来获取线程ID。
比如获取当前线程ID:
std::this_thread::get_id()
如果std::thread没有关联任何线程对象,那么get_id()会返回一个std::thread的默认构造函数对象。
【IT路上人】
长按左侧二维码或扫码关注
回复资源
领取IT电子书