互斥锁Mutex解锁两次

288 篇文章 25 订阅

一般我们都知道互斥锁包含的代码段,同一时间只能被一个线程调用,如果一个线程已经获取到互斥锁,还在代码段中(还未解锁),此时另一个线程执行此段代码时,是获取不到互斥锁的。

那么已经解锁的互斥锁,还能再次被解锁吗?
做测试:

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那样的问题;

(759条消息) 互斥锁Mutex解锁两次_水心123的博客-CSDN博客_互斥锁可以锁两次吗

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是互斥锁Mutex)的使用方法详细步骤: 1. 定义互斥锁变量:可以使用pthread_mutex_t类型的变量定义互斥锁。 ```c pthread_mutex_t mutex; ``` 2. 初始化互斥锁:使用pthread_mutex_init函数初始化互斥锁。 ```c pthread_mutex_init(&mutex, NULL); ``` 可以使用第二个参数来设置互斥锁的属性,一般使用默认属性,即NULL。 3. 加锁:使用pthread_mutex_lock函数加锁。 ```c pthread_mutex_lock(&mutex); ``` 如果互斥锁已经被其他线程加锁,那么当前线程就会被阻塞,直到获取到互斥锁为止。 4. 访问共享资源:加锁后可以访问共享资源。 5. 解锁:使用pthread_mutex_unlock函数解锁。 ```c pthread_mutex_unlock(&mutex); ``` 解锁后其他线程就可以获取该互斥锁,访问共享资源。 6. 销毁互斥锁:使用pthread_mutex_destroy函数销毁互斥锁。 ```c pthread_mutex_destroy(&mutex); ``` 需要注意的是,互斥锁的使用需要遵循以下规则: 1. 不要在加锁的情况下调用阻塞的函数,这样会导致死锁。 2. 加锁和解锁必须成对出现,不要多次加锁或解锁。 3. 不要在未加锁的情况下访问共享资源。 4. 不要在已经销毁的互斥锁上进行加锁或解锁等操作。 下面是一个简单的示例代码,演示了互斥锁的使用方法: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> pthread_mutex_t mutex; void *thread_func(void *arg) { int i; for (i = 0; i < 5; ++i) { pthread_mutex_lock(&mutex); // 加锁 printf("Thread %ld is running: %d\n", (long)arg, i); pthread_mutex_unlock(&mutex); // 解锁 sleep(1); } return NULL; } int main() { pthread_t t1, t2; pthread_mutex_init(&mutex, NULL); // 初始化互斥锁 pthread_create(&t1, NULL, thread_func, (void *)1); pthread_create(&t2, NULL, thread_func, (void *)2); pthread_join(t1, NULL); pthread_join(t2, NULL); pthread_mutex_destroy(&mutex); // 销毁互斥锁 return 0; } ``` 在该示例中,我们定义了一个互斥锁变量mutex,在两个线程中分别加锁和解锁,保证了对共享资源的访问是互斥的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值