一般我们都知道互斥锁包含的代码段,同一时间只能被一个线程调用,如果一个线程已经获取到互斥锁,还在代码段中(还未解锁),此时另一个线程执行此段代码时,是获取不到互斥锁的。
那么已经解锁的互斥锁,还能再次被解锁吗?
做测试:
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那样的问题;