C++ 并发编程指南(13)线程状态及切换

文章目录

前言:

C++中的线程状态及切换是操作系统和C++线程库(如POSIX线程或C++11及之后的<thread>库)共同管理的。线程的状态和切换是多线程编程中的重要概念,下面将简要介绍C++线程的主要状态以及它们之间的切换。

一、多线程状态及切换

1、线程状态

在C++中,线程的状态主要有以下几种:

  • 新建状态(New) :当一个线程对象被创建,但还没有调用其start()方法(对于C++11及之后的<thread>库)或相应的启动函数(如pthread_create对于POSIX线程)时,线程处于新建状态。
  • 就绪状态(Ready):线程已经启动,等待被操作系统调度到CPU上执行。此时线程已经具备了执行所需的所有资源,只是CPU资源还未分配给它。
  • 运行状态(Running):线程正在CPU上执行其代码。需要注意的是,由于时间片轮转、中断等机制,线程并不会一直运行在CPU上,而是会与其他线程交替执行。
  • 阻塞状态(Blocked):线程因为某些原因(如等待I/O操作完成、获取某个锁、执行了某个阻塞函数等)暂时放弃对CPU的使用权,进入阻塞状态。当阻塞的原因消除后,线程会重新进入就绪状态,等待被调度执行。
  • 终止状态(Terminated):线程执行完毕或因异常而终止,进入死亡状态。此时线程的资源会被操作系统回收,线程对象不能再被使用。

2、状态切换

线程状态的切换主要由操作系统和C++线程库共同管理,但具体实现会依赖于具体的操作系统和硬件。以下是一些常见的线程状态切换:

  • 新建状态 → 就绪状态:当线程被创建并调用启动函数后,线程会进入就绪状态,等待被操作系统调度执行。
  • 就绪状态 → 运行状态:操作系统使用某种调度算法(如先进先出、优先级调度等)从就绪队列中选择一个线程,将其状态从就绪状态切换为运行状态,并在CPU上执行其代码。
  • 运行状态 → 阻塞状态 :当线程执行到某个阻塞点时(如:执行了Thread.sleep(int n)方法等待I/O操作完成、获取某个锁等),线程会主动放弃对CPU的使用权,进入阻塞状态。操作系统会将线程从运行状态中移除,并将其添加到相应的阻塞队列中。
  • 阻塞状态 → 就绪状态:当阻塞的原因消除后(如I/O操作完成、锁被释放等),操作系统会将线程从阻塞队列中移除,并将其状态切换为就绪状态,等待被调度执行。
  • 运行状态 → 死亡状态:当线程执行完毕或因异常而终止时,线程会进入死亡状态。操作系统会回收线程的资源,并将线程从所有队列中移除。

需要注意的是,由于线程调度的复杂性和不确定性,以上状态切换并不是严格按照上述顺序进行的。在实际情况中,线程的状态切换可能会更加复杂和频繁。

相关推荐
203号居民5 分钟前
LeetCode hot 100 —560. 和为 K 的子数组
java·算法·leetcode
浪客川24 分钟前
使用 IDEA 生成API文档
java·ide·intellij-idea
郝学胜-神的一滴35 分钟前
Qt 高级编程 042:进度条从入门到自定义美化
开发语言·c++·qt·软件开发·用户界面
啦啦啦啦啦zzzz42 分钟前
5种IO模型
运维·服务器·网络·c++
呱呱巨基1 小时前
Docker 基础概念学习
linux·c++·学习·docker
上下求索,莫负韶华1 小时前
笔记-数据库事务和java事务和切面
java·数据库·笔记
@小匠1 小时前
Spring Boot Nacos绑定 Map 时中文 key 导致启动失败:一次从复现到源码的排查实录
java·开发语言·前端
Knight_AL1 小时前
Lombok @Builder 踩坑:build() 前后对象类型不一样
android·java·开发语言
SamChan902 小时前
PDF翻译中的并发控制:用Semaphore防止API限流与资源耗尽
java·jvm·pdf
大黄说说2 小时前
Java 与 Kotlin 混合开发避坑指南:老项目平滑迁移 Kotlin 实操手册
java·开发语言·kotlin