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的逻辑核数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python使用pandas的常用操作

文章目录 安装导入主要数据结构常用方法和操作创建数据结构读取和写入数据数据选择和过滤数据操作基本统计分析分组和聚合合并和连接重塑数据1. pivot 和 pivot_table2. melt3. stack和 unstack 常用方法总结pandas操作excel安装相关库 读取单个工作表读取指定工作表读取多个工…

短视频矩阵系统源码---开发BS架构B/S(Browser/Server Architecture)架构

短视频矩阵系统源头开发------- 第一款叫做筷子科技&#xff0c;这个筷子科技剪辑和发布都是没有问题的&#xff0c;但是前一段时间他的剪辑发个公告&#xff0c;每个账号只能发两条&#xff0c;另外它的唯一缺点就是它成本比较高的&#xff0c;入门门槛应该在12800左右&#…

CHATGPT升级plus(已有账号前提下)

注册wildcard(虚拟卡) 注册号账号后先进行充值&#xff0c;充值后选择CHATGPT一键升级按照他的流程来即可 Wildcard网址&#xff1a;Wildcard跳转注册 填写邀请码充值时少两美金合计14&#xffe5; 邀请码&#xff1a;OL3QXTRH

【2022-2011年】地级市数字经济指数原始数据+测算dofile+结果

参照赵涛等&#xff08;2020&#xff09;的文章&#xff0c;利用熵值法对城市数字经济指数进行测算&#xff0c;包括原始数据、线性插值、回归填补3种版本下测算的数字经济指数。保留原始数据、stata代码和测算结果&#xff0c;大家可进行复现 一、数据介绍 数据名称&#x…

useState和store的区别

useState 和 useStore 是 React 应用中用于管理数据状态的两种不同的 Hook。它们在功能和用途上有一些区别&#xff1a; useState useState 是 React 提供的一个 Hook&#xff0c;用于在函数组件中添加局部状态。每个 useState 调用都会返回一个数组&#xff0c;包含两个元素…

Python爬虫协程批量下载图片

import aiofiles import aiohttp import asyncio import requests from lxml import etree from aiohttp import TCPConnectorclass Spider:def __init__(self, value):# 起始urlself.start_url value# 下载单个图片staticmethodasync def download_one(url):name url[0].spl…

电机启动器:变频驱动器故障的原因

变频驱动器 (VFD)是 一种电子电机控制器&#xff0c;用于调节同步或感应电机 的转速 并驱动电力行业的负载。VFD也称为变频器、逆变器驱动器、交流驱动器、可调频驱动器、可调速驱动器、微型驱动器或变速驱动器&#xff0c;其 功能是选择电压频率并在用于驱动电机之前改变它。 …

12年外贸人的肺腑之言

转自Vicky 大家好&#xff0c;作为一个有着12年外贸经验的老鸟&#xff0c;今天我要和大家分享一些宝贵的建议&#xff0c;这些建议可能会对你的外贸之路产生重大影响。拿好小本本&#xff0c;记好笔记&#xff0c;我们直接进入正题。 首先&#xff0c;如果你决心要在外贸领域…

几万块投入,预防几百万损失——客户风险管理如何高效落地?

作为公司的风控负责人&#xff0c;老张近来最头疼的莫过于某大客户突然暴雷&#xff0c;一次性“送”了公司几十万坏账。事后复盘&#xff0c;老张发现公司现有的客户风险管理体系已相对落后&#xff0c;不再适用于快速变化的商业环境&#xff1a; 客户风险定级依靠销售人员提…

哥斯拉、冰蝎、中国蚁剑在护网中流量特征分析,收藏起来当资料吧,24年护网用得上

护网哥斯拉、冰蝎、中国蚁剑流量分析 【点击免费领取】CSDN大礼包&#xff1a;《黑客&网络安全入门&进阶学习资源包》&#x1f517;包含了应急响应工具、入侵排查、日志分析、权限维持、Windows应急实战、Linux应急实战、Web应急实战。 护网中最担心的是木马已经到了服…

Java2实用教程上机实践9,10,11

前言 大家好呀&#xff0c;大家肯定遇到过学校布置的作业不会做的情况吧&#xff1f;这个时候大量的网上找资料&#xff0c;找如何做这道题&#xff0c;为了帮助用Java2实用教程&#xff08;耿祥义 张跃平主编&#xff09;的学子们拿满平时分&#xff0c;这里整理出这本书中比…

数据集成赛道重回数据领域兵家“必争之地”!

作者 | 郭炜 导读&#xff1a;此前&#xff0c;《技术成熟度曲线2024》第一、二部分内容已发布&#xff0c;详见《「从ETL 到ELT&#xff0c;到 EtLT的趋势」》、《数据集成成熟度模型解读》。本文为报告的最后一篇&#xff0c;主要对数据集成技术进行趋势预测与总结&#xff0…

python的DataFrame和Series

Series、DataFrame 创建 pd.Series() pd.DataFrame() # 字典{列名:[值1&#xff0c;值2],} [[]] [()] numpy Pandas的底层的数据结构&#xff0c;就是numpy的数组 ndarray 常用属性 shape (行数&#xff0c;) (行数&#xff0c;列数) values → ndarray index 索引名 siz…

华为管理工程部的前世今生

我们经常讲管理是一项系统工程&#xff0c;但在企业实际的管理建设和改进中&#xff0c;往往又并没有把管理当作一项系统工程来对待&#xff0c;更没有通过持续的管理变革或业务变革&#xff08;BT&#xff0c;Business Transformation&#xff09;来打造这一系统工程&#xff…

磐石云pscc系统电话不能正常使用,或者接不到电话,什么情况?

磐石云PSCC系统电话无法正常使用或接不到电话可能会出现以下情况&#xff1a; 网络问题&#xff1a;可能是由于网络连接不稳定或网络设置问题导致系统电话功能无法正常工作。建议检查网络连接是否正常&#xff0c;确保网络稳定。 系统配置问题&#xff1a;可能是由于系统配置错…

ffmpeg.dll在哪个文件夹?怎么快速的修复ffmpeg.dll文件的丢失

在处理多媒体文件时&#xff0c;ffmpeg.dll文件扮演着至关重要的角色。它是FFmpeg项目的一部分&#xff0c;该项目提供了一套能够录制、转换和流化音视频的工具和库。用户有时可能会遇到 ffmpeg.dll文件丢失的问题&#xff0c;这个问题可能会妨碍视频编辑软件等应用程序的正常运…

Python 表达:探索语言艺术的深度与广度

Python 表达&#xff1a;探索语言艺术的深度与广度 Python&#xff0c;这门简洁而强大的编程语言&#xff0c;以其优雅的表达方式吸引着无数开发者。在Python的世界中&#xff0c;表达不仅关乎代码的执行&#xff0c;更是一种艺术。本文将分四个方面、五个方面、六个方面和七个…

《计算机在材料科学中的应用》、《计算材料学》、《计算化学》、《计算物理学》、《计算矿物学》、《量子动力学与光谱》这些高校课程,优秀大学的老师都是怎么讲的?

《计算机在材料科学中的应用》、《计算材料学》、《计算化学》、《计算物理学》、《计算矿物学》、《量子动力学与光谱》等高校课程面临以下问题 PWmat开课优势&#xff1a;拥有30余年代码开发经验&#xff0c;产品拥有自主知识产权&#xff0c;软著和知识产权均国产化网上可查…

零基础python爬虫从入门到精通

零基础python爬虫从入门到精通 课程介绍学习地址下期更新预报 课程介绍 本套视频教程适合想掌握爬虫技术的学习者&#xff0c;以企业主流版本Python 3.7来讲解&#xff0c;内容包括&#xff1a;Python基础、Urllib、解析&#xff08;xpath、jsonpath、beautiful&#xff09;、…