单线程死锁问题
一、单线程也会死锁?
是的,虽然“死锁”通常出现在多线程程序中,但单线程程序在使用阻塞资源访问机制(如锁、信号、IO等待)时,也可能进入死锁状态。这通常不是多个线程互相等待资源,而是一个线程自身等待永远不会满足的条件或资源。
二、单线程死锁的常见触发条件
- 重复加锁(Reentrant Lock)但锁不可重入在同一个线程内,多次尝试加锁同一个互斥锁,但锁类型不支持重入。例如:使用 pthread_mutex_lock 对同一个锁重复加锁。
- 等待自身释放资源单线程阻塞在某个资源或事件上,但事件的触发需要当前线程的进一步运行。如等待队列中有数据,但只有当前线程能往里放。
- 循环依赖状态机或消息处理比如在事件循环中阻塞等待某事件的完成,而该事件又需要主线程去调度。
- 同步IO或阻塞调用在死状态下使用 read()、recv()、accept() 等阻塞调用,且对应端未准备好,导致永远等待。
- 不当使用 condition variable(条件变量)pthread_cond_wait() 等配合互斥锁使用,如果没有正确唤醒机制,也可能陷入死等。
三、具体示例:重复加锁死锁
#include <pthread.h> pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; void func() {
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式面试八股文全集 文章被收录于专栏
这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。