1、什么是可重入锁?2、C++中有哪些可重入锁? 请简单介绍;C++中有哪些不可重入锁? 请简单介绍。3、请举一个C++可重入锁的例子;请举一个C++不可重入锁的例子。4、请介绍C++不可重入锁的优点和缺点;请介绍C++可重入锁的优点和缺点。
1、可重入锁是指同一个线程可以多次获得同一个锁而不会造成死锁的锁。也就是说,线程在持有锁的情况下,可以再次请求该锁而不会被自己阻塞。
2、在C++中,有以下可重入锁:
- std::recursive_mutex:递归互斥锁,可以被同一线程多次获得。当同一线程多次请求该锁时,只需在最后一次解锁时才会真正释放锁。
- std::recursive_timed_mutex:递归定时互斥锁,与递归互斥锁类似,但支持超时等待。
C++中没有明确定义不可重入锁,但可以通过使用普通互斥锁(std::mutex)来实现不可重入锁的效果。
3、一个C++可重入锁的例子如下:
#include <iostream>
#include <thread>
#include <mutex>
std::recursive_mutex mtx;
void func(int n) {
std::lock_guard<std::recursive_mutex> lock(mtx); // 获取锁
std::cout << "Thread " << n << " acquired the lock." << std::endl;
if (n > 0) {
func(n - 1); // 递归调用函数,再次获取锁
}
std::cout << "Thread " << n << " released the lock." << std::endl;
}
int main() {
std::thread t(func, 3);
t.join();
return 0;
}
一个C++不可重入锁的例子如下:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void func(int n) {
std::unique_lock<std::mutex> lock(mtx); // 获取锁
std::cout << "Thread " << n << " acquired the lock." << std::endl;
if (n > 0) {
func(n - 1); // 递归调用函数,再次请求锁会造成死锁
}
std::cout << "Thread " << n << " released the lock." << std::endl;
}
int main() {
std::thread t(func, 3);
t.join();
return 0;
}
4、C++不可重入锁的优点是简单易用,没有额外的开销。缺点是在同一线程内进行递归调用时会造成死锁,限制了代码的灵活性。
C++可重入锁的优点是可以在同一线程内进行递归调用而不会造成死锁,提供了更高的灵活性。缺点是相对于普通互斥锁,可重入锁可能会有一些额外的开销
原文地址: https://www.cveoy.top/t/topic/hSv5 著作权归作者所有。请勿转载和采集!