c++11中关于std::thread的join的详解

  1. 简介

C++11中,我们可以通过std::thread类来创建一个线程。该类提供了与操作系统级别的线程相关的方法,例如创建、销毁、挂起、恢复等。线程的执行中,有可能会出现多个线程共享同一个资源导致的竞争情况,此时,我们就需要对线程进行同步,在正确的时间点上对多个线程进行操作控制。join函数就是一个非常常用的同步方法。

  1. 使用方法

join函数用于等待线程的完成,并且将线程的执行控制权交给调用线程。join函数有两种使用方法:

  • 第一:使用join等待子线程完成后再执行后续任务
void do_something(int n) {
    // do something
}

int main() {
    std::thread t(do_something, 10);
    // 插入其他处理逻辑
    t.join();
    return 0;
}

在上述示例中,调用线程创建一个参数为10的do_something函数的子线程t,然后线程t马上开始执行。如果t.join()函数没有被调用,那么调用线程将继续运行。但是,如果在调用线程中,我们希望等待子线程执行完毕后再执行后续处理逻辑,那么我们可以在调用线程中使用t.join()进行等待。

  • 第二:使用detach函数后,需要使用join函数等待线程时
void do_something_else() {
    std::cout << "do something else" << std::endl;
}

int main() {
    std::thread t(do_something_else);
    t.detach();
    // 插入其他处理逻辑
    t.join();      // 此处会抛出std::system_error异常
    return 0;
}

在上述示例中,创建了一个子线程t,然后在子线程中执行do_something_else函数。由于该线程被使用了detach函数进行分离操作,我们认为线程t已经“接手”了对资源的控制,调用线程不再需要去处理该子线程。而join函数只有在创建线程没有使用detach函数分离时,才能有效等待。因此,使用join函数等待一个已经使用detach函数进行分离操作的线程时,将会抛出std::system_error异常。

  1. 总结

join函数的使用,可以保证在正确的时间点上对多个线程进行操作控制。在多线程编程中,使用join非常常见,因此熟练掌握这个函数的使用方法,对我们编写高质量的多线程程序至关重要。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++11中关于std::thread的join的详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C++中异常机制的实现机制详解

    C++中异常机制的实现机制详解 异常(Exception)是指程序运行时出现的一些不可预知的错误,比如非法输入、内存分配失败等。异常处理机制可以让程序在遇到异常时不会立即崩溃,而是可以做一些处理,让程序能够在异常发生后继续执行。 C++中的异常处理机制分为三个部分:抛出异常、捕获异常和处理异常。下面我们来详细讲解它们的实现机制。 抛出异常 抛出异常使用thr…

    C 2023年5月22日
    00
  • mysql 如何使用JSON_EXTRACT() 取json值

    当mysql存储JSON格式的数据时,我们需要对JSON进行提取。MySQL 5.7版本以上,提供了JSON_EXTRACT()函数来实现从JSON中提取值。 JSON_EXTRACT()函数的语法 JSON_EXTRACT(json_path) json_path为JSON路径参数,返回该路径下的JSON值。 示例1 已知json字段’data’的值为: …

    C 2023年5月23日
    00
  • docker如何对已经启动的容器添加目录映射(挂载目录)

    对已经启动的容器添加目录映射(挂载目录)是一项常见的操作。Docker 提供了docker container update命令来实现这个功能。以下是具体的步骤: 查看容器ID 使用docker ps命令可以查看已经启动的容器列表,找到需要挂载目录的容器并记住其容器ID。例如,我们找到容器名为web的ID为52a5af67b207。 $ docker ps …

    C 2023年5月23日
    00
  • C语言编程银行ATM存取款系统实现源码

    C语言编程银行ATM存取款系统实现源码攻略 背景介绍 随着现金支付逐渐落后于时代的步伐,银行ATM机成为了人们日常生活中不可或缺的一部分。银行ATM机内置了众多功能,例如可以查询余额、转账、存取款等,其中存取款是最为基本且常用的功能。 实现源码攻略 在实现ATM机的存取款系统时,我们可以采用C语言进行编程,以下是实现源码的攻略: 确定目标 在进行ATM机的编…

    C 2023年5月23日
    00
  • Qt5 实现主窗口状态栏显示时间

    作为一个Qt5开发者,我们要实现主窗口状态栏显示时间,可以按照以下步骤进行: Step 1:创建状态栏 首先,我们需要在主窗口中创建状态栏,可以在构造函数中添加如下代码: QMainWindow::QMainWindow(QWidget *parent) : QMainWindow(parent) { statusBar()->showMessage(…

    C 2023年5月22日
    00
  • 避免elif和ELSE IF的阶梯和阶梯问题

    避免使用过多的elif和elseif语句是一个组织代码的好习惯,因为它们会导致代码不易维护,出现错误的可能性也更大。以下是一些关于如何避免elif和elseif语句阶梯和阶梯问题的建议: 使用字典代替elif语句 如果有一系列的if…elif语句,每个分支中的代码差别较小,这可以使用字典代替。 例如,我们想根据性别来获取某人的称呼: def get_ti…

    C 2023年5月9日
    00
  • premiere新手常用之十大快捷键介绍

    Premiere新手常用之十大快捷键介绍 本篇文章将会介绍premiere新手常用的十大快捷键,帮助读者提高工作效率。以下是具体介绍: 1. 快速播放 按下空格键即可快速播放或暂停媒体文件,再按空格键将会继续播放,这是最基本的快捷键。 2. 快速剪辑 按下两次快进或快退键(通常是快捷键”L”和”J”),可使视频“蹦跳”至下一个或上一个edit point时间…

    C 2023年5月22日
    00
  • C语言实现简易版扫雷游戏

    C语言实现简易版扫雷游戏攻略 概述 本攻略将介绍如何使用C语言实现简易版扫雷游戏,包括实现随机雷区、点击格子、处理周围格子等功能。该游戏采用命令行界面,通过键盘输入操作。 实现步骤 1. 设置随机雷区 首先,需要在二维数组中生成随机雷区。定义一个二维数组保存游戏格子的状态,其中值为-1的表示雷,其余为数字,表示周围雷数。 #define ROWS 10 #d…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部