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

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(){// 获取当前线程的IDstd::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();// 获取当前主线程的IDstd::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.hqwc.cn/news/455690.html

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

相关文章

JAVA面试汇总总结更新中ing

本人面试积累面试题 多线程微服务JVMKAFKAMYSQLRedisSpringBoot/Spring 1.面向对象的三个特征 封装&#xff0c;继承&#xff0c;多态&#xff0c;有时候也会加上抽象。 2.多态的好处 允许不同类对象对同一消息做出响应&#xff0c;即同一消息可以根据发送对象的不同而采用多种…

苹果手机如何录屏?这里告诉你答案!

苹果公司的iPhone以其卓越的性能和用户体验受到了全球消费者的喜爱&#xff0c;而录屏功能作为手机的一项重要功能&#xff0c;能够帮助我们记录手机屏幕上的操作&#xff0c;分享游戏技巧、制作教程视频等。本文将为您介绍苹果手机如何录屏&#xff0c;帮助您更好地掌握录屏技…

国内唯一!通义灵码入选全球智能编码助手使用率 TOP 榜单

近日&#xff0c;在国内知名科技媒体 InfoQ 研究中心发布的《中国软件技术发展洞察和趋势预测报告 2024》中提到&#xff0c;随着 AI 和大模型技术的普及&#xff0c;开发者智能编码助手的使用习惯已经养成&#xff0c;其中&#xff0c;开发者使用的智能编码助手产品使用率超过…

C语言:内存函数

创作不易&#xff0c;友友们给个三连吧&#xff01;&#xff01; C语言标准库中有这样一些内存函数&#xff0c;让我们一起学习吧&#xff01;&#xff01; 一、memcpy函数的使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 1.1 使…

2.6作业

两个线程实现同步 #include <myhead.h> //定义条件变量 pthread_cond_t cond; //定义互斥锁 pthread_mutex_t mutex; //生产者 void *task1(void *arg) {int num 3;while(num--){sleep(1);printf("做了一顿饭\n");//唤醒等待队列中的所有线程pthread_cond_s…

Linux环境下配置mysql主从复制

主从配置需要注意的地方 1、主DB server和从DB server数据库的版本一致 2、主DB server和从DB server数据库数据一致[这里就会可以把主的备份在从上还原&#xff0c;也可以直接将主的数据目录拷贝到从的相应数据目录] 3、主DB server开启二进制日志,主DB server和从DB serve…

linux 自动定时清理缓存

文章目录 1&#xff0c;查看内存占用情况&#xff1a;1.1、free和available的区别&#xff1f;1.2、交换分区的作用&#xff1f; 2&#xff0c;手动清理命令3&#xff0c;定时自动清理3.1&#xff0c;创建文件夹3.2&#xff0c;新建文件cleanBuffer.sh3.3&#xff0c;添加内容3…

jsp教材管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 教材管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

9个Linux 查看系统硬件信息命令(实例详解)

在Linux下&#xff0c;我们精要遇到需要查看系统的硬件信息&#xff0c; 这里我罗列了查看系统硬件信息的实用命令&#xff0c;并做了分类&#xff0c;实例解说。 执行环境&#xff1a;ubuntu 16.04 1. cpu lscpu命令&#xff0c;查看的是cpu的统计信息. rootubuntu:/home/…

R语言入门笔记2.0

1.创建数据框 在R语言中&#xff0c;可以使用data.frame函数来创建数据框。以下是一个简单的示例&#xff0c;这段R语言代码创建了一个名为student的数据框&#xff0c;其中包含了学生的ID、性别、姓名和出生日期&#xff0c;首先创建一个包含学生出生日期的向量&#xff0c;再…

最小二乘圆锥拟合(梯度下降法+高斯牛顿法)

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 本期话题&#xff1a;最小二乘圆锥拟合 相关背景资料 点击前往 圆锥拟合输入和输出要求 输入 8到50个点&#xff0c;全部采样自圆锥上。每个点3个坐标&#xff0c;坐…

挑战杯 python+opencv+机器学习车牌识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器学习的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&#xff0c;适…