递归互斥量和非递归互斥量
时间: 2024-03-11 16:40:08 浏览: 12
在C++11中,提供了四种语义的互斥量(mutex),其中包括了递归互斥量和非递归互斥量。递归互斥量(std::recursive_mutex)允许同一个线程多次获得同一个互斥量,而非递归互斥量(std::mutex)则不允许同一个线程多次获得同一个互斥量。递归互斥量的使用场景一般是在递归函数中需要使用互斥量的情况下,而非递归互斥量则适用于一般的互斥场景。需要注意的是,递归互斥量的使用可能会导致代码逻辑不清晰,引发其他问题,因此建议酌情使用。
相关问题
python实现递归互斥锁
Python 实现递归互斥锁可以使用 threading 库中的 RLock 类。 RLock 是一种可重入锁,它允许同一线程在没有完全释放锁的情况下再次获得这个锁。
下面是一个简单的代码示例:
```
import threading
# 创建一个可重入锁
lock = threading.RLock()
def foo():
with lock:
print("foo 1")
with lock:
print("foo 2")
def bar():
with lock:
print("bar 1")
with lock:
print("bar 2")
# 创建两个线程并启动
threading.Thread(target=foo).start()
threading.Thread(target=bar).start()
```
运行上面的代码会输出:
```
foo 1
foo 2
bar 1
bar 2
```
可以看到,由于使用了 RLock 可重入锁,同一线程可以多次获取锁而不会导致死锁。
freertos互斥量头文件
在FreeRTOS中,互斥量是一种用于实现任务同步和资源共享的机制。互斥量头文件是"semphr.h"。
"semphr.h"头文件中定义了一些函数和宏,用于创建、删除、获取和释放互斥量。以下是一些常用的函数和宏:
1. xSemaphoreCreateMutex():创建一个互斥量。
2. xSemaphoreTake():获取一个互斥量,如果互斥量已被其他任务获取,则当前任务会被阻塞。
3. xSemaphoreGive():释放一个互斥量,使得其他任务可以获取该互斥量。
4. xSemaphoreGiveFromISR():在中断服务程序中释放一个互斥量。
5. xSemaphoreTakeRecursive():获取一个可递归的互斥量,同一个任务可以多次获取该互斥量而不会被阻塞。
6. xSemaphoreGiveRecursive():释放一个可递归的互斥量。
此外,"semphr.h"头文件还定义了一些宏,用于检查互斥量的状态和操作:
1. xSemaphoreGetMutexHolder():获取当前持有互斥量的任务句柄。
2. xSemaphoreGetMutexHolderName():获取当前持有互斥量的任务名称。