1.40、线程有哪些状态,线程锁有哪些种类?
线程的状态
- • 未启动(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】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1316
文章版权归作者所有,未经允许请勿转载。
THE END