CC++应用篇(002) 01_2 线程的调度,sleep的使用

特别声明,本系列学习教程来自【阿发你好】 官网地址:阿发你好
版权声明:本文为博主-黄可可(hkkhuang)-原创文章,未经博主允许可转载,但请标明出处,谢谢!

1、进程与线程

进程:当Test01_1A.exe被加载到内存中运行时,这个运行着的实例称为一个进程。( 可以在任务管理器中查看)

Test01_1A.exe称为程序文件

Test01_1A.exe可以被同时多次运行,每运行一次,则一个进程被创建。

一个进程中包含中多个线程。

2、线程的调度

一个进程中可以创建多个线程。其中至少有一个主线程(main线程)

由操作系统来负责安排调度:决定哪一个线程被运行。

(注意: 是操作系统决定了一切,我们只是来了解操作系统的行为,并用以达成我们的任务目标)

不同的操作系统,其调度算法可能是不一样的。

但是它们都遵循同一原则: 让所有的线程有机会运行。

2.1 时间片法

时间片法是一种普遍采用的调度算法。

介绍此算法的目的:辅助理解什么是”调度”。

基本原理:操作系统把CPU时间划分为多个均等的时间片。例如,每5ms一个时间片,在每个时间片内运行一个线程。总体上看,各个线程是被轮流运行的。

2.2 线程切换:

  • (1) 把当前的线程切到后台,进入队列等待
  • (2) 从队列中取得一个正在排队的线程,运行之
  • (3) 5毫秒后,再次切换把这个队列称为候选队列,表示这里面的线程都希望自己被立刻运行。
2.3 需要知道:
  • (1) 使用Sleep,可以主动让自己的线程提前让出CPU。
  • (2) Sleep时间到的时候,该线程并不是被立即执行,而是进入了候选队列。
  • (3) 操作系统是如何在候选队列里来挑选下一个线程的呢?不同的操作系统方法可能不一样,只需要大致了解。
注意:关于第2点:

比如,一个程序要Sleep”睡眠”一秒,则在一秒内该线程不被调度。当一秒以后,该线程苏醒,进入候选队列。

2.4 优先级

某些操作系统可能支持线程的优先级, Priority。

也就是说,允许我们在创建线程的时候,指定一下线程的优先级。如果优先级较高,则该线程在运行的时候拥有较高的机会被调度。

但是不推荐使用优先级这个特性,因为:

  • (1) 并不是所有的操作系统都支持优先级
  • (2) 优先级无法定量:倒底有多优先,是个说不准的事情。

2.5 合理利用Sleep

所以,关于线程调度,我们干预的手段是Sleep。它是所有的操作系统都支持的。

通过积极的Sleep,让出CPU,来达到有效地调度。

再次强调: Sleep不是一个精确的东西,在“醒来”之后不能保证该线程立即被调度。所以,你如果Sleep设定了N毫秒,那么实际间隔的时间一般会大于N。

Sleep一般会支持毫秒量级。

在OSAPI中提供了两个函数:

static void Msleep(int milli_sec);  //毫秒量级
static void Sleep(int sec); //秒量级
视频教程地址:阿发你好
示例代码地址:Github-hkkhuang Test01_2A
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值