一般我们都知道互斥锁包含的代码段,同一时间只能被一个线程调用,如果一个线程已经获取到互斥锁,还在代码段中(还未解锁),此时另一个线程执行此段代码时,是获取不到互斥锁的。
那么已经解锁的互斥锁,还能再次被解锁吗?
做测试:
static void MutexTest(void)
{
printf("互斥锁解锁两次测试\r\n");
MutexLock(&mutex);
printf("互斥锁加锁\r\n");
MutexUnLock(&mutex);
printf("第一次解锁成功\r\n");
MutexUnLock(&mutex);
printf("第二次解锁成功\r\n");
}
测试结果:
互斥锁解锁两次测试
互斥锁加锁
第一次解锁成功
Error: Mutex unlock failed, The current thread does not own the mutex
第二次解锁成功
可以看到第二次解锁的时候,解锁失败,但是它并不会像加锁那样,连续操作两次就卡住;
回归到互斥锁的本质:
1.如果是Linux系统:互斥锁是由信号量实现的,连续两次解锁,当然不会卡住;但是如果此时有另外一个线程也在等待互斥锁,那当你第二次解锁的时候,另外一个线程也将进入代码段,这是不被允许的;
2.如果是小系统:互斥锁可能是由某个全局变量实现,加锁解锁其实就是对变量的+1或-1,同样也会有Linux那样的问题;

本文探讨了互斥锁Mutex在解锁时可能出现的异常情况,通过一个测试案例展示了当互斥锁已被解锁后尝试再次解锁会导致错误。分析了在Linux系统和小型系统中,互斥锁的实现方式及其可能引发的问题,如多线程竞争条件。同时,博客指出了连续解锁互斥锁可能对其他等待锁的线程产生的影响。
1144

被折叠的 条评论
为什么被折叠?



