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

static SemaphoreHandle_t xMutexB = NULL;

xMutexA = xSemaphoreCreateMutex();

xMutexB = xSemaphoreCreateMutex();

两个任务互相不释放对方的锁