[TOC]

概述

文章参考:http://shouce.jb51.net/cpp_concurrency_in_action/

文章参考:https://sanctorum003.github.io/2021/08/06/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/MultiThreads/C++_MultiThreads/

多线程并发即多个线程同时执行,一般而言,多线程并发就是把一个任务拆分为多个子任务,然后交由不同线程处理不同子任务,使得这多个子任务同时执行

实现C++多线程并发程序的思路如下:将任务的不同功能交由多个函数分别实现,创建多个线程,每个线程执行一个函数,一个任务就这样同时分由不同线程执行了。

什么时候不适用多线程并发

  • 每创建一个线程,系统要分配给线程相应的栈空间,用于保存上下文信息.
  • 如果线程执行过快导致上下文切换频繁,这将导致收益比不上成本

基础知识

创建线程

std::ref和std::cref /std::bind

  • std::ref 用于包装按引用传递的值
  • std::cref 用于包装按const引用传递的值

使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//创建线程
std::thread THREAD_NAME(FUNCTION_NAME,PARAM...);

//当线程启动后,一定要在和线程相关联的std::thread对象销毁前,对线程运用join()或者detach()方法。


//当使用join()函数时,主调线程阻塞,等待被调线程终止,然后主调线程回收被调线程资源,并继续运行;
THREAD_NAME::join();

//当使用detach()函数时,主调线程继续运行,被调线程驻留后台运行,主调线程无法再取得该被调线程的控制权。当主调线程结束时,由运行时库负责清理与被调线程相关的资源。
THREAD_NAME::detach();

//joinable()函数是一个布尔类型的函数,他会返回一个布尔值来表示当前的线程是否是可执行线程(能被join或者detach),因为相同的线程不能join两次,也不能join完再detach,同理也不能detach,所以joinable函数就是用来判断当前这个线程是否可以joinable的。
THREAD_NAME::joinable();

创建线程时的传参问题分析