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…

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…

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

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

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

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

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

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

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

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

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

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

Windows 11下载以及安装教程

1.下载安装 Windows 有三种下载方式&#xff0c;根据需求&#xff0c;选择其中一种方式就可以。 安装助手 下载工具&#xff0c;进行下载 下载Windows 11 镜像文件ISO 安装后效果 查看状态 2.下载 Windows 工具 https://pan.baidu.com/s/1dFl9QQ1rIGcsZLUD0dym6A?pwdwin1…

MYSQL数据库客户端常规指令使用

这里新开一章&#xff0c;对MYSQL进行更加底层的系统的一个学习 Mysql常用工具简介 emmmm这里的话就默认大家在linux系统上面都进行了MYSQL的安装了. 在mysql安装完成之后&#xff0c;一般在路径 /usr/bin 下的 我们对该路径进行一个文件的展示 这里是展示出来的辅助工具 …

海外短剧新体验:多平台适用,语言无障碍

前言 在数字化时代的浪潮下&#xff0c;海外短剧作为一种新兴的视听媒介&#xff0c;正逐渐走进我们的生活。这些由国外制作团队精心打造的短片或微电影&#xff0c;不仅内容丰富多彩&#xff0c;更在跨文化传播中展现出独特的魅力。 一、海外短剧系统有什么亮点&#xff1f; …

JS面试题:hash和history的区别

一、hash 模式和 history 模式的介绍 由于 Vue 项目为单页面应用&#xff0c;所以整个项目在开发和构建过程中&#xff0c;仅存在一个HTML物理文件。通过路由系统可以实现将项目的组件与可访问的URL路径进行绑定。由于Vue项目只有一个HTML物理文件&#xff0c;切换页面时既需要…

Android中打印某应用的堆栈信息

先更具报名获取pid adb shell "ps|grep 包名" zygote的堆栈dump 实际上这个可以同时dump java线程及native线程的堆栈&#xff0c;对于java线程&#xff0c;java堆栈和native堆栈都可以得到。 kill -3 <pid> debuggerd的堆栈dump debuggerd是android的一个…

20240604将OK3588-C的核心板刷机Buildroot之后强制横屏

20240604将OK3588-C的核心板刷机Buildroot之后强制横屏 2024/6/4 17:13 viewproviewpro-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508/kernel/arch/arm64/boot/dts/rockchip$ grep dsi0 . -R ./Makefile:dtb-$(CONFIG_ARCH_ROCKCHIP) rk3568m-serdes-evb-display-dsi…

代码解读 | Hybrid Transformers for Music Source Separation[01]

一、背景 今天对Hybrid Transformer Demucs代码进行解读&#xff0c;目标&#xff1a;明确图c中各个模块对应的代码具体在工程的哪个地方。解读的代码是开源工程中的htdemucs.py。 具体的paper解读看这篇文章。 二、代码解读 算法整体流程&#xff1a;图c其实是从下往上看的&a…

快速入门C++正则表达式

正则表达式&#xff08;Regular Expression&#xff0c;简称 Regex&#xff09;是一种强大的文本处理工具&#xff0c;广泛用于字符串的搜索、替换、分析等操作。它基于一种表达式语言&#xff0c;使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。正则表达式不仅在…