- 持有一个Mutex时等待另一个Mutex可能产生死锁。
- 两个任务相反的加锁顺序容易形成循环等待。
- 死锁时调度器仍然运行,只是相关任务永久Blocked。
- 优先级继承不能解决循环等待。
- 最重要的预防方法是统一加锁顺序。
- 第二个锁获取失败时必须释放已经持有的锁。
- 有限超时可以检测和恢复,但不能代替正确设计。
- 尽量避免同时持有多个Mutex。
static SemaphoreHandle_t xMutexA = NULL;
static SemaphoreHandle_t xMutexB = NULL;
xMutexA = xSemaphoreCreateMutex();
xMutexB = xSemaphoreCreateMutex();
两个任务互相不释放对方的锁