C++多线程编程(2):四种线程管理方法

文章首发于我的个人博客:欢迎大佬们来逛逛

文章目录

线程管理

有一个this_thread的名称空间中定义了许多的线程管理方法:

  • get_id:获取当前线程id
  • sleep_for:当前线程休眠一段时间
  • sleep_for:当前线程休眠,直到某个时间点之后结束休眠
  • yield:当前线程立刻被抛弃,释放CPU时间片

get_id

获取当前线程id,每个线程的id都是唯一的,并且也可以获取主线程的id:

cpp 复制代码
//获取线程Id
void threadID() {
	std::cout << "Id: " << std::this_thread::get_id() << '\n';
}

sleep_for

chrono库提供了许多关于时间的操作,在我们接下来的介绍中需要用到。

当前线程休眠一段时间,其中一段时间是你自己给出的。

实际上调用这个函数会立刻使得线程从运行态转为阻塞状态,并且休眠一段时间。

位于阻塞态会让出当前的CPU资源,因此可以使得其他线程使用他让出的CPU资源,提高资源的利用率。

线程的五种状态:创建,就绪,运行,阻塞,终止

函数原型如下:

  • chrono::duration:表示一个时间段。
cpp 复制代码
void sleep_for(const chrono::duration<...>& durationTime)

具体如何传参?

cpp 复制代码
std::this_thread::sleep_for(std::chrono::seconds(2));  // 休眠两秒
std::this_thread::sleep_for(std::chrono::microseconds(2000)); //休眠两千毫秒

还有minutes,hours等等。

cpp 复制代码
//sleep_for延迟函数
void testSleep_for() {
	std::cout << "子线程sleep_for: \n";
	std::this_thread::sleep_for(std::chrono::seconds(2));
	std::cout << "子线程sleep_for结束: \n";
}

sleep_until

该函数与上面的函数类似,只不过他接受一个时间点 ,上面的sleep_for是一个时间段

cpp 复制代码
void sleep_until(const chrono::time_point<...>& _Abs_time)

对于chrono如何表示一个时间点**time_point** 有以下方法:

  • system_clock:获取系统时间

  • steady_clock: 表示稳定时间间隔,即不随系统时间修改而变化的时间间隔。

  • high_resolution_clock: 实际上就是上一种

    cpp 复制代码
    using high_resolution_clock = steady_clock;

如何获取当前时间?

使用now()函数

以下三种根据情况使用,都可以作为sleep_until的参数。

cpp 复制代码
std::chrono::high_resolution_clock::now();
std::chrono::system_clock::now();
std::chrono::steady_colck::now();

具体应用:

使得每次打印间隔两秒 的时间间隔,如下我们构造了一个时间点

实际上与sleep_for类似,只不过sleep_for表示一个时间段,sleep_until表示到...为止,是一个时间点。

cpp 复制代码
std::cout << "子线程Sleep_untild: \n";
	for (int i = 1; i <= 10; i++) {
		auto startTime = std::chrono::steady_clock::now();
		std::this_thread::sleep_until(startTime+std::chrono::seconds(2));
		std::cout << "i= " << i << '\n';
	}
std::cout << "子线程Sleep_untild结束: \n";

yield

该函数表示立刻抛弃(立刻停止)此线程,释放CPU时间片,并且立刻使得该线程从运行转到就绪状态

注意虽然抛弃了此线程,释放了CPU的资源,但是它仍然会参与到下一轮的线程CPU时间片的争夺中,也就是说我调用了这个函数函数,为什么感觉没有什么用呢?实际上这是一个概率问题。

案例:

每执行一次循环,让该线程主动放弃 CPU 资源重新和其他线程再次抢夺 CPU 时间片,如果其他线程抢到了 CPU 时间片就可以执行相应的任务了。

否则容易出现其他线程没有机会执行的困难。

cpp 复制代码
void testYield2(int id) {
	for (int i = 1; i <= 1000; i++) {
		std::cout << "id: " <<id << ": " << i << '\n';
		std::this_thread::yield();
	}
}

...
std::thread t3(testYield2, 1);
std::thread t4(testYield2, 2);
t3.join();
t4.join();
相关推荐
智者知已应修善业4 小时前
【51单片机89C51及74LS273、74LS244组成】2022-5-28
c++·经验分享·笔记·算法·51单片机
Byron Loong7 小时前
【c++】为什么有了dll和.h,还需要包含lib
java·开发语言·c++
坚果派·白晓明7 小时前
【鸿蒙PC三方库移植适配框架解读系列】第一篇:Lycium C/C++ 三方库适配 — 概述与环境配置
c语言·开发语言·c++·harmonyos·开源鸿蒙·三方库·c/c++三方库
咩咦8 小时前
C++学习笔记02:cin 和 cout 输入输出
c++·学习笔记·cin·输入输出·cout
咩咦8 小时前
C++学习笔记05:引用和常引用
c++·学习笔记·引用·const·常引用
香蕉鼠片8 小时前
算法过程中不会的
开发语言·c++
阿旭超级学得完9 小时前
C++11包装器(function和bind)
java·开发语言·c++·算法·哈希算法·散列表
li星野9 小时前
位运算 & 数学 & 高频进阶九题通关(Python + C++)
c++·python·学习·算法
磊 子9 小时前
多态类原理+四种类型转换+异常处理
开发语言·c++·算法
王老师青少年编程9 小时前
csp信奥赛C++高频考点专项训练之字符串 --【回文字符串】:回文拼接
c++·字符串·csp·高频考点·信奥赛·字符串回文·回文拼接