1.40、线程有哪些状态,线程锁有哪些种类?

线程的状态

C++标准库本身并未直接定义线程的详细状态枚举,但结合操作系统和通用概念,线程的典型状态包括:

  • • 未启动(Unstarted):线程对象已创建,但尚未调用std::thread::joinable()std::thread::join,线程尚未运行。
  • • 运行中(Running):线程已启动,正在执行任务。
  • • 阻塞/等待(Blocked/Waiting):线程因等待某些事件(如锁、条件变量、I/O)而暂停执行。
  • • 挂起(Suspended):线程被操作系统或程序显式挂起(非标准C++状态,多见于操作系统层面)。
  • • 终止(Stopped/Finished):线程执行完毕或被强制终止,资源待回收。

线程锁的种类

C++11及以后标准提供了多种同步原语,主要包括以下几类锁:

1. 互斥锁(Mutex)

  • • std::mutex:最基本的互斥锁,单线程独占,阻塞等待锁释放。
  • • std::timed_mutex:支持带超时的锁尝试。
  • • std::recursive_mutex:允许同一线程多次加锁(递归锁)。
  • • std::recursive_timed_mutex:递归锁且支持超时。
  • • std::shared_timed_mutex(C++14起):读写锁,支持多个读线程共享锁,写线程独占锁。

2. 锁管理器

  • • std::lock_guard:简单RAII风格的互斥锁管理,构造时加锁,析构时解锁,不支持手动解锁。
  • • std::unique_lock:更灵活的锁管理器,支持延迟加锁、提前解锁、锁转移等。
  • • std::shared_lock:用于shared_timed_mutex的共享锁管理,支持多个读者同时持有锁。

3. 其他同步原语

  • • 条件变量(std::condition_variable):线程间等待和通知机制。
  • • 原子操作(std::atomic):无锁同步基础。
  • • 信号量、屏障、门闩(C++20新增):更高级的线程协调工具。

总结

方面 说明
线程状态 未启动、运行中、阻塞/等待、挂起、终止(操作系统层面更丰富)
互斥锁 std::mutex及其递归、定时、共享变种
锁管理器 std::lock_guard(简单)、std::unique_lock(灵活)、std::shared_lock(共享锁)
其他同步 条件变量、原子操作、信号量、屏障等

理解线程状态有助于设计合理的线程生命周期管理,掌握多种锁及其使用场景则是避免竞态条件、死锁和提升并发性能的关键。面试时,结合实际场景说明不同锁的特性和适用性,会展现扎实的并发编程功底。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)

阅读剩余
THE END