C++并发之线程(std::thread)

目录

  • 1 概述
  • 2 使用实例
  • 3 接口使用
    • 3.1 construct
    • 3.2 assigns
    • 3.3 get_id
    • 3.4 joinable
    • 3.5 join
    • 3.6 detach
    • 3.7 swap
    • 3.8 hardware_concurrency

1 概述

  Thread类来表示执行的各个线程。
  执行线程是指可以在多线程环境中与其他此类序列同时执行的指令序列,同时共享相同的地址空间。
  初始化的线程对象表示执行的活动线程;这样的线程对象是可连接(joinable)的,并且具有唯一的线程id。
  默认构造(未初始化)的线程对象是不可连接的,其线程id对于所有不可连接线程都是通用的。
  如果移动赋值,或者对可连接线程调用join或detach,则可连接(joinable)线程将变为不可连接线程。
其类图如下:
类图

2 使用实例

void function_a()
{
    std::cerr << "this is in funciton_a" << std::endl;
}

void function_b(int n)
{
    for(int i = 0; i < n; i++)
        std::cerr << "this is in funciton_b" << std::endl;
}

struct C
{
    void function(int n)
    {
        for(int i = 0; i < n; i++)
            std::cerr << "this is in C::funciton" << std::endl;
    }
};

void ThreadSuite::construct()
{
    C func;
    std::thread a;
    std::thread b(function_a);
    std::thread c(function_b, 2);
    std::thread d(&C::function, std::ref(func), 2);
    std::thread e = std::thread(function_b, 3);
    TEST_ASSERT_EQUALS(false, a.joinable())
    TEST_ASSERT_EQUALS(true, b.joinable())
    TEST_ASSERT_EQUALS(true, c.joinable())
    TEST_ASSERT_EQUALS(true, d.joinable())
    TEST_ASSERT_EQUALS(true, e.joinable())

    b.join();
    c.join();
    d.join();
    e.join();
}

3 接口使用

3.1 construct

void ThreadSuite::construct()
{
    C func;
    std::thread a;
    std::thread b(function_a);
    std::thread c(function_b, 2);
    std::thread d(&C::function, std::ref(func), 2);
    std::thread e = std::thread(function_b, 3);
    TEST_ASSERT_EQUALS(false, a.joinable())
    TEST_ASSERT_EQUALS(true, b.joinable())
    TEST_ASSERT_EQUALS(true, c.joinable())
    TEST_ASSERT_EQUALS(true, d.joinable())
    TEST_ASSERT_EQUALS(true, e.joinable())

    b.join();
    c.join();
    d.join();
    e.join();
}

3.2 assigns

void ThreadSuite::assigns()
{
    std::thread a(function_a);
    std::thread b;

    TEST_ASSERT_EQUALS(true, a.joinable())
    TEST_ASSERT_EQUALS(false, b.joinable())
    b = std::move(a);
    TEST_ASSERT_EQUALS(false, a.joinable())
    TEST_ASSERT_EQUALS(true, b.joinable())
    b.join();
}

说明:

  • 移动赋值后,线程由可连接变成不可连接了。

3.3 get_id

struct FunctionForGetId
{
    std::thread::id id;
    void function()
    {
        id =  std::this_thread::get_id();
    }
};

void ThreadSuite::get_id()
{
    FunctionForGetId fun;
    std::thread a;
    std::thread b;
    std::thread c(&FunctionForGetId::function, std::ref(fun));
    std::thread::id id = c.get_id();
    TEST_ASSERT_EQUALS(true, a.get_id() == b.get_id())
    c.join();
    TEST_ASSERT_EQUALS(true, (fun.id == id))
    TEST_ASSERT_EQUALS(true, (fun.id != c.get_id()))
}

说明:

  • 未初始化的线程其id是相同的。
  • 线程join前后线程id是不同的。

3.4 joinable

void ThreadSuite::joinable()
{
    std::thread a(function_a);
    std::thread b;

    TEST_ASSERT_EQUALS(true, a.joinable())
    TEST_ASSERT_EQUALS(false, b.joinable())
    a.join();
    TEST_ASSERT_EQUALS(false, a.joinable())
}

说明:

  • 线程join后线程变为不可连接了

3.5 join

void ThreadSuite::join()
{
    std::thread a(function_a);
    std::thread b;

    TEST_ASSERT_EQUALS(true, a.joinable())
    TEST_ASSERT_EQUALS(false, b.joinable())
    a.join();
    if(b.joinable())
        b.join();
    TEST_ASSERT_EQUALS(false, a.joinable())
}

说明:

  • 对不可连接线程调用join,将导致不可预料结果。
  • 线程join后线程变为不可连接了

3.6 detach

void ThreadSuite::detach()
{
    std::thread a(function_a);
    TEST_ASSERT_EQUALS(true, a.joinable())
    a.detach();
    TEST_ASSERT_EQUALS(false, a.joinable())
    std::this_thread::sleep_for(std::chrono::milliseconds(50));
}

说明:

  • 线程detach后线程变为不可连接了

3.7 swap

void ThreadSuite::swap()
{
    std::thread a(function_a);
    std::thread b;

    TEST_ASSERT_EQUALS(true, a.joinable())
    TEST_ASSERT_EQUALS(false, b.joinable())
    a.swap(b);
    TEST_ASSERT_EQUALS(false, a.joinable())
    TEST_ASSERT_EQUALS(true, b.joinable())
    b.join();
}

3.8 hardware_concurrency

void ThreadSuite::hardware_concurrency()
{
    std::cerr << "\n\nhardware_concurrency:" << std::thread::hardware_concurrency() << std::endl;
    TEST_ASSERT_EQUALS(true, std::thread::hardware_concurrency() > 0)
}

说明:

  • 该函数返回硬件并发性,我的机器返回12,正好是CPU的逻辑核数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/678154.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go 语言的函数详解:语法、用法与最佳实践

在 Go 语言的世界里&#xff0c;函数是构建和维护任何应用程序的基石。不仅因为它们提供了一种将大问题划分为更小、更易管理部分的方法&#xff0c;而且还因为它们在 Go 程序中扮演着至关重要的角色。从简单的工具函数到复杂的系统级调用&#xff0c;理解和利用 Go 的函数特性…

企业因未安全保存个人信息被罚:警示网络数据安全重要性

网络攻击的隐蔽性越来越强&#xff0c;对网络安全提出了更高的要求。在进行等保测试时&#xff0c;网络运营商能够对系统的安全保护状况有一个大致的认识&#xff0c;并对系统内部和外部都有可能出现的安全问题进行分析&#xff0c;并对其进行加固和修正&#xff0c;以此来增强…

GPT-4与GPT-4O的区别详解:面向小白用户

1. 模型介绍 在人工智能的语言模型领域&#xff0c;OpenAI的GPT-4和GPT-4O是最新的成员。这两个模型虽然来源于相同的基础技术&#xff0c;但在功能和应用上有着明显的区别。 GPT-4&#xff1a;这是一个通用型语言模型&#xff0c;可以理解和生成自然语言。无论是写作、对话还…

全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯

资料下载地址&#xff1a;全新STC12C5A60S2单片机LCD19264大屏万年历农历生肖节气节日显示闹钟温湿度台灯 这是旧版 退役拆解了 新版 与电路图所示 共设置4个按键 短按开关台灯 加减键调光 长按进入菜单 1.台灯 加入PCA PWM 调光 STC12C5A60S2的PCA PWM非常好用 设置简单无极…

文件夹突变解析:类型变文件的数据恢复与预防

在数字化时代&#xff0c;文件夹作为我们存储和组织数据的基本单元&#xff0c;其重要性不言而喻。然而&#xff0c;有时我们可能会遇到一种令人困惑的情况——文件夹的类型突然变为文件&#xff0c;导致无法正常访问其中的内容。这种现象不仅会影响我们的工作效率&#xff0c;…

如何把几个pdf文件合成在一个pdf文件

PDF合并&#xff0c;作为一种常见的文件处理方式&#xff0c;无论是在学术研究、工作汇报还是日常生活中&#xff0c;都有着广泛的应用。本文将详细介绍PDF合并的多种方法&#xff0c;帮助读者轻松掌握这一技能。 打开 “轻云处理pdf官网” 的网站&#xff0c;然后上传pdf。 pd…

dnf手游版游玩感悟

dnf手游于5月21号正式上线&#xff0c;作为一个dnf端游老玩家&#xff0c;并且偶尔上线ppk&#xff0c;自然下载了手游版&#xff0c;且玩了几天。 不得不说dnf手游的优化做到了极好的程度。 就玩法系统这块&#xff0c;因为dnf属于城镇地下城模式&#xff0c;相比…

神经网络是什么?有什么作用?

人工智能是当前的热门科技领域&#xff0c;在自动驾驶、金融服务、智能家居、零售和电商、工业制造、医疗领域、教育领域、交通领域、娱乐领域、能源管理、农业、航空航天等很多领域都有越来越多的应用。 发展人工智能&#xff0c;离不开算力&#xff08;芯片&#xff09;、算…

【Python】 Python装饰器的魔法:深入理解functools.wraps

基本原理 在Python中&#xff0c;装饰器是一种设计模式&#xff0c;用于修改或增强函数或方法的功能。functools.wraps是一个装饰器工厂&#xff0c;它用来帮助我们保持被装饰函数的元数据&#xff0c;比如函数的名字、文档字符串等。 当你创建一个装饰器时&#xff0c;你可能…

进口泰国榴莲注意事项 | 国际物流运输服务 | 箱讯科技

进口泰国榴莲&#xff0c;这个看似简单的行为背后其实隐藏着许多需要注意的细节和相关费用。下面小编带大家了解一下有哪些细节和费用需要注意。 01清关费用 进口泰国榴莲涉及的清关费用包括&#xff1a; 国外提货成本、港口服务费、报关手续费。 国际运输费&#xff0c;可能…

《幸福》期刊杂志投稿发表

《幸福》杂志是由国家新闻出版总署批准&#xff0c;武汉出版社主管&#xff0c;武汉市妇联和武汉出版社联合主办&#xff0c;面向全国发行的人文社科综合期刊。办刊宗旨&#xff1a;宣传普及科学知识及科学方法的研究&#xff1b;倡导新型的人际关系&#xff0c;推介健康的家庭…

Linux学习笔记8

介绍man命令 在Linux中&#xff0c;man命令用于查看系统手册页&#xff08;manual pages&#xff09;。系统手册页是关于各种Linux命令、函数库以及系统调用的详尽文档&#xff0c;能够提供关于命令的使用方法、参数说明、示例以及其他相关信息 可以利用man xxx的命令去查找某…

探索气象数据的多维度三维可视化:PM2.5、风速与高度分析

探索气象数据的多维度可视化&#xff1a;PM2.5、风速与高度分析 摘要 在现代气象学中&#xff0c;数据可视化是理解复杂气象模式和趋势的关键工具。本文将介绍一种先进的数据可视化技术&#xff0c;它能够将PM2.5浓度、风速和高度等多维度数据以直观和动态的方式展现出来。 …

Facebook与AI:探索人工智能在社交平台上的应用

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;社交媒体平台正利用这些先进技术为用户提供更为个性化和高效的体验。作为全球最大的社交媒体平台之一&#xff0c;Facebook在AI应用领域的探索和实践尤为引人注目。本文将深入探讨Facebook如何在其平台上应用…

23-通过JS代码处理click失效问题

有时候按钮元素已经定位到了&#xff0c;运行也没报错&#xff0c;点击后页面没有反应。这种问题是比较头疼的&#xff0c;因为没有任何报错&#xff0c;只是click事件失效了。本篇用两种方法解决这种诡异的点击事件失效问题。 一、遇到的问题 在百度的搜索设置中&#xff0c;…

VisionPro界面乱序或字体排版异常,字体不适应界面窗口大小

很多人在安装Visionpro后都遇到了一个界面显示异常的问题&#xff1a; 打开visionpro后字体大小不统一,显示不全或显示在其他窗口之上&#xff0c;如下所示。 解决该问题&#xff0c;首先关闭Visionpro软件&#xff0c;右击软件选择属性->兼容性。勾选兼容模式下面的方框。…

2024年6月4日13:48:07-3.8功能说明1.保存草稿2.支持自定义SKU销售规格3.全网爆款企划支持一键提交

创建产品产品保存草稿、自定义编辑规格功能使用手册 尊敬的淘工厂商家&#xff1a; 淘工厂近两个月收到很多商家对淘工厂发品&#xff08;上品&#xff09;效率提升的改进建议&#xff0c;淘工厂本月将针对产品发布页的发品效率提升上线一系列改进功能&#xff0c;希望能加速…

存内计算:硬件的未来,今日已来

引言 存内计算的概念 存内计算&#xff08;In-Memory Computing, IMC&#xff09;是一种创新的计算架构&#xff0c;它颠覆了经典的冯诺依曼范式&#xff0c;其中数据和指令存储与数据处理是分开的。在存内计算模型中&#xff0c;计算单元被直接集成到存储器内部&#xff0c;…

了解CAN功能

了解CAN功能&#xff0c;学习CAN功能&#xff0c;理解CAN和串口的区别&#xff0c;以及它和RS485的相似之处。 1、“多主机”特性 在CAN网络通讯中&#xff0c;无需其它设备同意&#xff0c;每个CAN设备都可以主动向外发送数据&#xff0c;且所有设备都会收到数据&#xff0c…

基于springboot实现智慧校园之家长子系统项目【项目源码】计算机毕业设计

基于springboot实现智慧校园之家长子系统演示 SpringBoot框架介绍 本课题程序开发使用到的框架技术&#xff0c;英文名称缩写是SpringBoot&#xff0c;在JavaWeb开发中使用的流行框架有SSH、SpringBoot、SpringMVC等&#xff0c;作为一个课题程序采用SSH框架也可以&#xff0c…