vlambda博客
学习文章列表

C++11多线程与并发初探

现在计算机技术领域,实现并发程序已经成为所有C++程序员的必备技能。随着程序越来越复杂,并发的应用越来越多。今天我们就来了解下C++11多线程和并发实现。

什么是并发(concurrency)?

并发指应用能够交替执行不同的任务。当多个程序在相互通信时同时运行时,就会发生并发,这个过程是由多个不同的线程执行的。并发不是同时执行多个任务而是同一时间段内发生了多件事情,但是因为完成的非常快速,看起来像是同时发生。

C++并发性的历史

并发在C++中第一次被引入是在C++ 11的标准中,C++11并发包括线程、C++内存模型、条件变量、互斥等等。C++ 11标准与C++ 17的标准发生了巨大的变化。在C++17版本的标准模板库(STL)中加入了并行算法,大大提高了并发代码的性能。

并发(Concurrency)与并行(parallelism)

并发性和并行性常常混淆在一起,但理解两者之间的区别很重要。

并发:指应用能够交替执行不同的任务。

两者区别:一个是交替执行,一个是同时执行。

C++11多线程与并发初探

在C++中,实现并发最常见的两种方法是多线程和并行。虽然这些可以用于其他编程语言,但C++的并发优点更多,首先C++比其他编程语言拥有更低的平均开销,其次C++具备实现复杂指令的能力。

下面,我们将探讨C++编程中的并发编程和多线程。

C++多线程

C++多线程涉及创建和使用线程对象(比如使用std::thread来创建线程对象)来独立执行委托的子任务。在创建线程时,将向线程传递一个要完成的函数,并可选的为该函数传递参数。

C++11多线程与并发初探

虽然每个单独的线程可能一次只完成一个功能,但线程池允许我们回收和重用线程对象,从而给程序带来了无限多任务的错觉。这不仅利用了多个CPU内核,而且还允许开发人员通过操作线程池大小来控制执行的任务数。这样可以确保程序有效地使用计算机资源,而不会导致系统过载。

C++11多线程创建方法

在每个C++应用程序中,都有一个主线程(main函数)。在C++11标准中,创建线程可以通过类std::thread来创建。该类需要包含头文件:

#include <thread>

初始化std::thread类对象,有三种参数传递方式:

  • 函数指针

  • 类对象

  • lambda表达式

例如,可以这样创建线程对象:

std::thread thObj(<CALLBACK>);

线程对象创建后,就可以并行地执行传递的回调函数。

如果在退出前,想等待所有线程结束再退出,可以使用join()函数。

1. 使用函数指针创建线程

C++11多线程与并发初探


2. 使用类对象创建线程

C++11多线程与并发初探

  

3. 使用lambda表示创建线程

线程在运行过程中,如果区分线程呢?

每个线程都有自己的线程ID,通过std::thread创建的线程可以使用std::thread::get_id()来获取线程ID。

比如获取当前线程ID:

std::this_thread::get_id()

如果std::thread没有关联任何线程对象,那么get_id()会返回一个std::thread的默认构造函数对象。



【IT路上人】

长按左侧二维码或扫码关注

回复资源

领取IT电子书