C++多线程:this_thread 命名空间

news2024/11/17 16:47:49

std::this_thread 是 C++ 标准库中提供的一个命名空间,它包含了与当前线程相关的功能。这个命名空间提供了许多与线程操作相关的工具,使得在多线程环境中更容易进行编程。
源码类似于如下:

namespace std{
	namespace this_thread{
    	//...................
    } 
}

在这里插入图片描述

get_id( )

get_id( )
std::this_thread::get_id(): 返回当前线程的唯一标识符,类型为 std::thread::id。可以用来识别不同的线程。

两种方法获取线程ID

方法一: 利用线程名中的API接口获取(推荐)

void myFunction(){

}
int main()
{;
	std::thread myThread(myFunction);
	std::thread::id myThreadId = myThread.get_id();
	cout <<  "myThreadId: " <<  myThreadId << endl;
	myThread.join();
}

在这里插入图片描述

方法二: 在线程函数中利用this_thread返回当前线程的ID

void myFunction(){
	// 获取当前线程的ID
    std::thread::id threadId = std::this_thread::get_id();
    std::cout << "Thread ID inside myFunction: " << threadId << std::endl;
};

int main()
{
	// 创建线程
    std::thread myThread(myFunction);
	//等待线程执行完成
    myThread.join();

    // 获取当前主线程的ID
    std::thread::id mainThreadId = std::this_thread::get_id();
    std::cout << "Main Thread ID: " << mainThreadId << std::endl;
}

在这里插入图片描述

yield( )

std::this_thread::yield() 是 C++ 标准库中的一个函数,它的作用是让当前线程放弃其执行权,主动让出 CPU 时间片,以便其他线程有机会执行。具体来说,yield() 函数的调用会导致当前线程进入就绪态,允许调度器在就绪线程中选择另一个线程来执行。

这个函数的原型如下:

namespace std {
    namespace this_thread {
        void yield() noexcept;
    }
}

使用 yield() 的主要场景是在多线程编程中,当一个线程希望让出 CPU 执行权,以便其他线程能够执行。这样可以更好地利用系统资源,提高多线程程序的效率。以下是一个简单的示例,演示了 yield() 的基本用法:

#include <iostream>
#include <thread>
void worker() {
    for (int i = 0; i < 5; ++i) {
        std::cout << "Worker: " << i << std::endl;
        std::this_thread::yield(); // 让出执行权
    }
}

int main() {
    std::thread workerThread(worker);
    for (int i = 0; i < 5; ++i) {
        std::cout << "Main: " << i << std::endl;
        std::this_thread::yield(); // 让出执行权
    }
    workerThread.join();
    return 0;
}

sleep_for()

std::this_thread::sleep_for(): 让当前线程休眠一段指定的时间。

#include <iostream>
#include <chrono>
int main() {
    std::cout << "Sleep for 2 seconds...\n";
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::cout << "Awake!\n";
    return 0;
}

在这里插入图片描述
std::chrono是C++11提供的时间库(更具体说它也是一个命名空间,它的库头文件名和命名空间名称相同)。库中的核心组件是持续时间(duration),它是时间段的表示。持续时间可以以秒、毫秒、微秒等不同单位表示。例如,std::chrono::seconds表示以秒为单位的时间段,而std::chrono::milliseconds和std::chrono::microseconds分别表示毫秒和微秒。
原型如下:

namespace std {
    namespace chrono{
        ..............
    }
}

std是一级命名空间,chrono是二级命名空间。

sleep_until( )

std::this_thread::sleep_until() 用于让当前线程休眠直到指定的时间点。该函数接受一个表示时间点的参数,并在当前线程休眠直到达到或超过该时间点。使用 sleep_until() 可以在程序中实现对时间的精确控制。
以下是 sleep_until() 函数的原型:

namespace std {
    namespace this_thread {
        template<class Clock, class Duration>
        void sleep_until(const chrono::time_point<Clock, Duration>& sleep_time);
    }
}

sleep_until() 接受一个时间点参数,其中 Clock 表示时钟类型,Duration 表示时间间隔类型。通常,ClockDuration 会使用 std::chrono 命名空间中的类型。

下面是一个示例,演示如何使用 sleep_until() 将当前线程休眠至指定时间点:

在这个例子中,sleep_until() 被用来休眠当前线程至指定的时间点。首先获取了当前时间点 now,然后计算了一个未来的时间点 sleep_time(当前时间点之后的5秒),最后通过 sleep_until() 函数实现线程的休眠。

#include <iostream>
#include <thread>
#include <chrono>
int main() {
    // 获取当前时间点
    auto now = std::chrono::system_clock::now();

    // 设置休眠时间为当前时间点之后的5秒
    auto sleep_time = now + std::chrono::seconds(5);

    std::cout << "Sleeping until: " << std::chrono::system_clock::to_time_t(sleep_time) << std::endl;

    // 休眠至指定时间点
    std::this_thread::sleep_until(sleep_time);

    std::cout << "Awake!" << std::endl;

    return 0;
}

打印输出:
在这里插入图片描述

std::chrono::system_clock::to_time_t(sleep_time):将时间点转为时间戳(距离1970年1月1日零时零分零秒的间隔秒数)

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

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

相关文章

Sentinel(理论版)

Sentinel 1.什么是Sentinel Sentinel 是一个开源的流量控制组件&#xff0c;它主要用于在分布式系统中实现稳定性与可靠性&#xff0c;如流量控制、熔断降级、系统负载保护等功能。简单来说&#xff0c;Sentinel 就像是一个交通警察&#xff0c;它可以根据系统的实时流量&…

第8节、双电机多段直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;前面章节主要介绍了bresenham直线插值运动&#xff0c;本节内容介绍让两个电机完成连续的直线运动,目标是画一个正五角星 一、五角星图介绍 五角星总共10条直线&#xff0c;10个顶点。设定左下角为原点…

【Jenkins】pipeline基本使用

目录 一、pipeline 二、创建pipeline项目 1、安装pipeline插件 2、创建pipeline项目 三、pipeline语法 1、pipeline组成 2、agent&#xff1a;指定流水线的执行位置&#xff0c;流水线中每个阶段都必须在某个地方执行 3、stage&#xff1a;阶段&#xff0c;代表流水线的…

牛客——牛可乐的翻转游戏(状压,dfs)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 牛可乐发明了一种新型的翻转游戏&#xff01; 在一个有 nnn 行 mmm 列的棋盘上&#xff0c;每个格子摆放有一枚棋子&#xff0c;每一枚棋子的颜色要么是黑色&#xff0c;要么是白色。…

Simulink|光伏阵列模拟多类故障(开路/短路/阴影遮挡/老化)

目录 主要内容 模型研究 1.正常模型 2.断路故障 3.短路故障 4.阴影遮挡 5.老化模型 结果一览 1.U-I曲线 2.P-V曲线 下载链接 主要内容 该模型为光伏阵列模拟故障情况simulink模型&#xff0c;程序实现了多种故障方式下的光伏阵列输出功率-电压-电流关系特…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Radio组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Radio组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Radio组件 单选框&#xff0c;提供相应的用户交互选择项。 子组件 无。 接口 …

【前端素材】bootstrap4实现移动端电商APP页面 MobileShop(附源码)

一、需求分析 移动端电商网页是指为移动设备&#xff08;如智能手机和平板电脑&#xff09;优化设计的电子商务网页。它是在线商店的移动版本&#xff0c;旨在提供方便的购物体验和无缝的移动端操作。 移动端电商网页通常具有以下功能&#xff1a; 商品展示&#xff1a;移动端…

25.云原生ArgoCD高级之app of apps模式

文章目录 app of apps 模式介绍app如何管理apphelm方式管理kustomize方式管理 app of apps 模式介绍 通过一个app来管理其他app&#xff0c;当有多个项目要发布创建多个app比较麻烦&#xff0c;此时可以创建一个管理app&#xff0c;管理app创建后会创建其他app。比较适合项目环…

docker部署docker管理工具easydockerweb

重要提示 功能比较少,建议体验一下即可 安装 docker run -it -d -p 10041:3000 -e EDW_USERNAMEadmin -e EDW_PASSWORDadmin -v /var/run/docker.sock:/var/run/docker.sock qfdk/easydockerweb 使用 概览 镜像管理 容器管理

VS编译器对scanf函数不安全报错的解决办法(详细步骤)

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

使用pandas将excel转成json格式

1.Excel数据 2.我们想要的JSON格式 {"0": {"raw_data1": "Sam","raw_data2": "Wong","raw_data3": "Good","layer": "12v1"},"1": {"raw_data1": "Lucy…

Redis(三)(实战篇)

查漏补缺 1.spring 事务失效 有时候我们需要在某个 Service 类的某个方法中&#xff0c;调用另外一个事务方法&#xff0c;比如&#xff1a; Service public class UserService {Autowiredprivate UserMapper userMapper;public void add(UserModel userModel) {userMapper.…

AR人脸106240点位检测解决方案

美摄科技针对企业需求推出了AR人脸106/240点位检测解决方案&#xff0c;为企业提供高效、精准的人脸识别服务&#xff0c;采用先进的人脸识别算法和机器学习技术&#xff0c;通过高精度、高速度的检测设备&#xff0c;对人脸进行快速、准确地定位和识别。该方案适用于各种应用场…

Vue-53、Vue技术vuex使用

vuex 是什么 1、概念 专门在Vue 中实现集中式状态&#xff08;数据&#xff09;管理的一个Vue 插件&#xff0c;对vue 应用中多个组件的共享状态进行集中式的 管理&#xff08;读/写&#xff09;&#xff0c;也是一种组件间通信的方式&#xff0c;且适用于任意组件间通信。2、…

大数据Zookeeper--案例

文章目录 服务器动态上下线监听案例需求需求分析具体实现测试 Zookeeper分布式锁案例原生Zookeeper实现分布式锁Curator框架实现分布式锁 Zookeeper面试重点选举机制生产集群安装多少zk合适zk常用命令 服务器动态上下线监听案例 需求 某分布式系统中&#xff0c;主节点可以有…

发现本地Elasticsearch版本 不兼容第三方管理工具 带大家在官网中寻找并下载指定版本的Elasticsearch

我们在 springboot 整合Elasticsearch时可能会出现版本不兼容异常 首先 大家要搞清楚 目前 Elasticsearch(ES)与springboot 市场版本互相的兼容情况 可以参考我的文章 springboot与Elasticsearch版本兼容对比 这里 我们想下载 其他版本 还是访问官网 https://www.elastic.co/…

探索LLM的意图识别能力

不可否认的是&#xff0c;LLM&#xff08;例如 OpenAI 的 GPT 系列&#xff09;将在不断发展的对话式 AI 领域发挥重要作用。 关于使用 ChatGPT 执行各种任务的帖子和文章不计其数。 GPT 有几个关键功能值得进一步探索&#xff0c;例如其摘要、分类和生成文本的能力。 其中&…

U盘误删的文件怎么找回?5个宝藏方法分享!

“我想问问大家&#xff0c;在使用u盘时如果不小心把很重要的文件删除了应该怎么办呀&#xff1f;有什么简单又快速的U盘文件恢复方法可以推荐吗&#xff1f;” U盘作为一种便携式的存储设备&#xff0c;在日常工作中扮演着重要的角色。然而&#xff0c;如果不小心误删了U盘中的…

SpringBoot:自动配置报告

自动配置报告demo&#xff1a;点击查看 LearnSpringBoot03AutoConfig 点击查看更多的SpringBoot教程 一、application.properties代码 #开启springboot debug模式 #自动配置报告 #Positive matches: 自动配置类启用了&#xff08;自动配置类匹配上了&#xff09;&#xff0c…

hexo和github.io博客的搭建

简要&#xff1a; 最近在牛客网上看到有很多应届毕业生大佬的求职简历上都写上了自己的博客地址&#xff0c;并且在acwing上看到图图佬&#xff0c;铅笔佬也有自己的博客地址&#xff0c;大部分都采用了自己搭建博客的方式&#xff0c;而不是用脏乱差的csdn来写博客。所以我也采…