C++ 线程操作

2023-05-16

C++ 线程操作

概述

线程是 Linux 操作系统中的一种轻量级进程,用于实现并发执行。线程可以共享进程的资源,包括内存、文件句柄等。在 C++ 中,线程操作由标准库提供支持,主要涉及以下几个头文件:

#include <thread>    // 线程相关的库
#include <mutex>     // 互斥量相关的库
#include <condition_variable>  // 条件变量相关的库

创建线程
在 C++ 中,使用 std::thread 类创建新线程。创建线程的基本形式为:

std::thread t1(func, args...);

其中 func 是线程执行的函数,args… 是函数的参数列表。

示例:

#include <iostream>
#include <thread>

void threadFunc(int n) {
    std::cout << "Thread ID: " << std::this_thread::get_id() 
              << ", n = " << n << std::endl;
}

int main() {
    std::thread t1(threadFunc, 10);
    t1.join();   // join后主线程将会被阻塞,等待线程结束
    return 0;
}

上述代码中,threadFunc 函数被传递给 std::thread 类的构造函数创建一个新线程。线程执行函数中输出线程 ID 和传入的参数值。t1.join() 语句等待线程结束后才会继续执行主线程。

互斥量

在多线程编程中,当多个线程同时访问共享资源时,容易出现竞态条件(Race Condition),导致程序出现不可预期的行为。为了避免这种情况,可以使用互斥量(Mutex)来保护共享资源,确保同一时间只有一个线程可以访问它。

互斥量使用 std::mutex 类实现,常用的方法有:

lock():获得互斥量的锁。
unlock():释放互斥量的锁。
示例:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;  // 定义互斥量

void threadFunc(int n) {
    mtx.lock();   // 获得互斥量的锁
    std::cout << "Thread ID: " << std::this_thread::get_id() 
              << ", n = " << n << std::endl;
    mtx.unlock(); // 释放互斥量的锁
}

int main() {
    std::thread t1(threadFunc, 10);
    std::thread t2(threadFunc, 20);

    t1.join();
    t2.join();
    return 0;
}

在上述代码中,std::mutex 类型的 mtx 对象用于保护 threadFunc 函数中的输出操作,以避免同时输出导致的混乱。

条件变量

在多线程编程中,有时需要让线程等待某个条件满足后再继续执行,这时可以使用条件变量(Condition Variable)来实现。

条件变量使用 std::condition_variable 类实现,常用的方法有:

  • wait(lock, pred):等待条件变量满足。lock 是互斥量,用于保护条件变量; pred 是一个可调用对象,用于判断条件是否满足。
  • notify_one():唤醒一个等待条件变量的线程。
  • notify_all():唤醒所有等待条件变量的线程。

示例:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mtx;  // 定义互斥量
std::condition_variable cv;  // 定义条件变量

bool ready = false;  // 条件变量状态标志

void threadFunc(int n) {
    std::unique_lock<std::mutex> lock(mtx);
    while (!ready) {   // 等待条件变量
        cv.wait(lock);
    }
    std::cout << "Thread ID: " << std::this_thread::get_id() 
              << ", n = " << n << std::endl;
}

int main() {
    std::thread t1(threadFunc, 10);
    std::thread t2(threadFunc, 20);

    // 设置条件变量状态标志
    std::this_thread::sleep_for(std::chrono::seconds(2));
    ready = true;
    cv.notify_all();  // 唤醒所有等待条件变量的线程

    t1.join();
    t2.join();
    return 0;
}

在上述代码中,std::condition_variable 类型的 cv 对象用于实现线程等待条件变量的功能。在 threadFunc 函数中,使用 cv.wait(lock) 等待条件变量。在 main 函数中,先等待一段时间后设置条件变量状态标志 ready 为 true,再通过 cv.notify_all() 唤醒所有等待条件变量的线程。

使用场景

线程操作可以应用于很多场景,比如:
多线程下载文件:可以使用多个线程同时下载文件,提高下载速度。
多线程处理数据:可以使用多个线程同时处理数据,提高处理效率。
多线程编程游戏:可以使用多个线程处理游戏逻辑和渲染,提高游戏性能。
多线程爬虫:可以使用多个线程同时爬取网页,提高爬虫效率。
当然,使用线程操作时需要注意线程安全性问题,避免出现竞态条件等问题。同时也需要注意线程间通信的问题,确保线程间可以正确地传递信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 线程操作 的相关文章

  • HTML5基础知识(全面)

    1 熟记各大主流浏览器内核版本面试常问哦 浏览器名称内核opera欧朋最初是自己的Presto内核 xff0c 后谷歌Webkit 到BlinkFirefox火狐Gecko内核俗称Firefox内核Chrome谷歌统称为Chromium或B
  • Java错题集(十六)

    目录 在第16行插入哪段代码可以获得一个Point对象的坐标 下面说法正确的是 xff1f xff08 xff09 如果此类已编译并运行 xff0c 则哪两个语句正确 xff1f true false null sizeof goto sy
  • 树莓派4b利用官方软件安装系统

    目录 资源准备一 安装系统1 格式化TF卡2 安装系统 二 连接启动1 连接2 登陆3 开启vnc 总结 资源准备 硬件 xff1a 树莓派4b板子 8G以上TF卡 读卡器 软件 xff1a 官方安装软件 xff1a Raspberry P
  • 解决树莓派4b开启VNC报错无法正确显示桌面

    开启vnc报错 原因 xff1a 由于分辨率太小 xff0c 无法显示 解决办法 xff1a 在终端输入以下内容 sudo raspi config 选择Display Options进入 选择VNC Resolution 选择除第一个分辨
  • js中数组内删除指定对象

    先上代码 xff01 span class token comment 因我使用的是xm select组件 xff0c 所以自带change xff08 即新变化的对象 xff09 和arr xff08 选中的所有对象 xff09 span
  • 【JDK1.8 新特性】Lambda表达式

    1 什么是Lambda表达式 xff1f Lambda 是一个匿名函数 xff0c 我们可以把 Lambda 表达式理解为是一段可以传递的代码 xff08 将代码像数据一样进行传递 xff09 使用它可以写出更简洁 更灵活的代码 作为一种更
  • 封装axios请求

    1 引入所需模块 引入axios模块 import axios from 39 axios 39 使用qs模块 xff0c 进行文件序列号化操作 import qs from 39 qs 39 2 判断当前环境 环境变量 let baseU
  • Matlab的Gpu加速(CUDA cudnn)

    多CUDA版本的切换 xff0c 及Matlab版本对应的CUDA版本 学习笔记 Matlab的Gpu加速 安装CUDA和cudnn时 xff0c 踩了不少坑 xff0c 总结如下几个经验 xff1a 1 显卡驱动的版本与CUDA是一对多的
  • win10添加新硬盘

    win10添加新硬盘 前言 前言 小白指导 xff0c 白到不能再白了 xff01 xff01 xff01 直接上图 关于文件系统介绍 文件系统是系统对文件的存放排列方式 xff0c 不同格式的文件系统关系到数据是如何在磁盘进行存储 xff
  • idea2020创建maven javaweb项目并运行 示例

    idea2020创建maven javaweb项目并运行 一 项目的创建二 pom xml简单介绍三 添加tomcat插件以方便运行项目1 在pom xml文件里加入以下配置 四 创建servlet并 运行项目1 创建Java文件夹并在文件
  • C++实现算法服务的一些经验总结

    文章目录 一 算法模型调用的几种方式二 python算法服务的优缺点三 C 43 43 算法服务的优缺点四 C 43 43 算法服务的几种实现方式五 C 43 43 基于http的算法服务实现思路六 记录调用 xff1a 日志 数据库七 性
  • Java中使用jedis操作redis(使用maven)

    jedis的使用 前言一 简单使用示例1 快速入门2 操作五种数据格式 二 jedis连接池 xff1a jedisPool1 示例2 jedies详细配置 三 创建连接池工具类1 jedis properties2 JediesPoolU
  • maven中使用jdbc

    用到的有数据库连接池 JDBCTemplate 一 首先导入jar包 lt mysql驱动 xff0c 使用对应版本jar包依赖 gt lt dependency gt lt groupId gt mysql lt groupId gt l
  • 解决风扇狂转不止的好方法

    这两天风扇狂转不止 xff0c 真让我头疼 xff0c 现在弄好了 安装一个软件 软件官网 我的是thinkpade580 xff0c 对其他电脑生不生效我不清楚 xff08 但可以一试 xff09 下载后直接安装即可 有个地方实时显示着温
  • 安装hadoop3.x版本踩坑

    报错 xff1a ERROR Attempting to operate on hdfs namenode as root ERROR but there is no HDFS NAMENODE USER defined Aborting
  • 报错:Description: No bean of type ‘org.apache.shiro.realm.Realm‘ found

    springboot整合shiro的时候出现了报错 报错信息 xff1a Description No bean of type 39 org apache shiro realm Realm 39 found Action Please
  • 计算机网络课后习题概略

    计算机网络 课后习题 第一章 概述 1 01 计算机网络可以向用户提供哪些服务 xff1f 服务功能或作用数据传输网络间个计算机之间互相进行信息的传递 资源共享进入网络的用户可以对网络中的数据 软件和硬件实现共享 分布处理功能通过网络可以把
  • Kittle案例(Excel输入,生成记录,生成随机数,获取系统信息,排序记录,去除重复记录,替换NULL值)

    一 Excel输入 1 创建转换 将要处理的文件保存到Excel表中 xff0c 然后打开kettle创建一个转换并命名 xff0c 拖入 Excel输入 控件 2 配置Excel输入控件 浏览导入Excel文件 单击 浏览 B 按钮 xf
  • 第七章 数据加载

    一 全量加载 从技术角度来说 xff0c 全量加载比增量加载的操作要简单很多 xff0c 即只需要在数据加载之前 xff0c 将目标数据表进行清空 xff0c 再将源数据表中的数据全部加载到目标表中 案例实现 xff1a 数据装备 xff1
  • 第八章 综合案例——构建DVD租赁商店数据仓库(1)

    一 加载日期数据至日期维度表 操作介绍 xff1a 下面通过Kettle工具加载日期数据至dim date日期维度表 1 打开Kettle工具 xff0c 创建转换 使用Kettle工具 xff0c 创建一个转换load dim date

随机推荐

  • 第八章 综合案例——构建DVD租赁商店数据仓库(2)

    一 加载用户数据至用户维度表 操作介绍 xff1a 通过Kettle工具加载用户数据至用户维度表dim customer 1 打开Kettle工具 xff0c 创建转换load dim customer 使用Kettle工具 xff0c 创
  • C++与python交互库-pybind11的返回值策略 return_value_policy

    pybind11的返回值策略 return value policy 一 返回值策略的必要性二 一个导致crash的例子三 所有的返回值策略的探讨四 补充说明 一 返回值策略的必要性 C 43 43 和python使用根本上就不一样的内存管
  • 第八章 综合案例——构建DVD租赁商店数据仓库(3)

    一 加载演员数据至演员维度表 操作介绍 xff1a 通过Kettle工具加载演员数据至演员维度表dim actor 1 打开Kettle工具 xff0c 创建转换 使用Kettle工具 xff0c 创建一个转换load dim actor
  • 树莓派4b安装python库

    树莓派4b安装python库 树莓派安装好系统后自带的有python2和python3 xff0c 默认是使用python2 xff0c 可以打开树莓派查看 xff1a 输入python 查看默认的python版本 xff1a 我原来默认是
  • SONIC+P4

    SONIC简介 背景 微软于2015年先后发表了SAI和SONIC SONIC产业日益繁荣 xff0c 已超过六十家 创新 SONiC使用了大量现有的开源技术 xff1a Docker Redis Quagga和LLDPD以及自动化配置工具
  • 6.ROS&PX4--Pixhawk无人机+A1激光雷达SLAM部署

    6 ROS amp PX4 无人机A1激光雷达SLAM部署 一 常见2D SLAM算法 Gmapping Hector SLAM Cartographer Gmapping 基于粒子滤波的2D激光雷达SLAM xff0c 构建二维栅格地图
  • Codeblock提示: Can‘t find compiler executable in your configured search path‘s for GNU GCC无法找到编译器

    can t find compiler executable in your configured search path s for GUN GCC Complier的应对办法 今天使用codeblocks 点击Settings Comp
  • Hexo系列 | Hexo安装、启动

    目录 前言 一 Hexo是什么 二 安装node js 三 安装Git 四 检查是否安装成功 五 Hexo安装 启动 前言 用Hexo框架搭建个人博客 xff0c 记录搭建过程 个人博客效果 一 Hexo是什么 Hexo官网 Hexo 是一
  • 【python】python语法糖

    python 语法糖 1 什么是语法糖 x1f36c 语法糖是由编程语言提供的一种可以让我们写出来的代码在不影响语句执行的功能的条件下 xff0c 能够让我们的代码看起来更简洁和美观的一种语法 很多人刚开始接触语法糖的时候 xff0c 总会
  • 因装了python3.6版本导致ubuntu下terminal无法打开

    参考stack overflow xff1a https stackoverflow com questions 61144232 updated to python 3 8 terminal wont open fixed but det
  • E: 无法下载 https://mirrors.tuna.tsinghua.edu.cn/kali/dists/kali-rolling/main/Contents-amd64.gz 文件尺寸不符

    本人是新手 这个问题困扰了我很久 在网上也查了很久 答案千篇一律 我写下我的解决方法 希望对你有帮助 问题 E 无法下载 https mirrors tuna tsinghua edu cn kali dists kali rolling
  • 软件工程知识点总结

    1 软件的本质 1 1 软件是什么 xff1a 软件是能够完成预定功能和性能 xff0c 并对相应数据进行加工的程序和描述程序操作的文档 1 2 软件的特点 软件是设计开发的 xff0c 而不是传统意义上生产制造的软件不会 磨损 虽然整个工
  • C++ lambda表达式如何理解?编译器做了什么

    lambda表达式在C 43 43 11中引入 xff0c 用lambda表达式表示匿名函数非常方便 xff0c 语法很简单 xff0c 而且可以使代码更紧凑 xff0c 更易于阅读 一个例子 xff1a span class token
  • mysql主从复制&读写分离

    文章目录 本文内容前言1 MySQL主从复制1 1 介绍1 2 搭建1 2 1 准备工作1 2 2 主库配置1 2 3 从库配置 1 3 测试 2 读写分离案例2 1 背景介绍2 2 ShardingJDBC介绍2 3 数据库环境2 4 初
  • 输出所有质数

    1 实验目的 了解数字 布尔值 字符串 列表 元组 字典 集合等Python常用的变量类型 熟练掌握运算符 内置函数的用法 熟练掌握元素常用方法 切片和列表推导式 2 实验内容 xff08 一 xff09 输出所有质数 输入一个整数 xff
  • 声音克隆项目实现

    声音克隆 原理介绍 第一个模块 xff1a 收到说话人音频 xff0c 然后转成这样一个低维表征向量speaker embedding xff0c xff08 这个向量富含说话信息 xff09 实现方式 xff1a 由于是无监督学习 xff
  • c语言枚举类型

    定义 在c语言中 xff0c 枚举类型定义用关键字enum标识 xff0c 形式为 xff1a enum 名字 枚举数据表 xff08 用 xff0c 隔开 xff09 xff1b 注意 xff1a xff08 1 xff09 enum是关
  • 交换机二三层协议及其详细解答

    交换机二三层协议及其详细解答 概述二层协议三层协议以太网协议示例代码 CSMA CD协议示例代码 IP协议示例代码 概述 交换机是网络设备的一种 xff0c 主要用于连接多个网络设备 xff0c 以实现网络通信和数据传输 交换机的协议分为两
  • C++ MVC模式

    概述 C 43 43 是一种流行的编程语言 xff0c 它可以用于构建各种类型的应用程序 xff0c 包括Web应用程序 桌面应用程序和移动应用程序 在这里 xff0c 我将为您介绍C 43 43 中的MVC模式 xff0c 以及如何在C
  • C++ 线程操作

    C 43 43 线程操作 概述 线程是 Linux 操作系统中的一种轻量级进程 xff0c 用于实现并发执行 线程可以共享进程的资源 xff0c 包括内存 文件句柄等 在 C 43 43 中 xff0c 线程操作由标准库提供支持 xff0c