c++各种锁
unique_lock的特点:
-
unique_lock提供了更多的控制锁的行为,比如锁超时、不锁定、条件变量等。
-
它是可移动的,可以拷贝、赋值、移动。
-
unique_lock比lock_guard更重,因为它有更多的功能,更多的开销。
-
支持手动解锁,而lock_guard不支持。
lock_guard的特点:
-
lock_guard是基于互斥锁std::mutex实现的,而unique_lock是基于通用锁std::unique_lock实现的。
-
lock_guard是不可移动的,即不能拷贝、赋值、移动,只能通过构造函数初始化和析构函数销毁。
-
如果只需要简单的互斥保护,使用lock_guard更好。
递归锁recursive_mutex:
可以参考linux c递归锁,相当于给锁设置递归属性PTHREAD_MUTEX_RECURSIVE。可以对照学习。
std::recursive_mutex 是 C++11 标准库中提供的一种递归互斥锁,允许同一线程多次对同一个互斥锁加锁,而不会引发死锁。这种特性在递归函数或嵌套调用中非常有用,能够简化代码逻辑并提高可维护性。
基本特性
递归互斥锁允许同一线程多次加锁,但需要解锁相同次数才能释放锁。与普通的 std::mutex 相比,std::recursive_mutex 会记录加锁次数,因此性能略低于普通互斥锁。
以下是其主要特性:
-
递归加锁:支持同一线程多次加锁。
-
线程安全:保护共享资源,避免数据竞争。
-
适用场景:递归函数或嵌套调用中需要多次加锁的情况。
#include <iostream>
#include <thread>
#include <mutex>
std::recursive_mutex rmtx;
void recursive_function(int count) {
rmtx.lock();
std::cout << "Mutex locked, count = " << count << std::endl;
if (count > 0) {
recursive_function(count - 1); // 递归调用
}
rmtx.unlock();
}
int main() {
std::thread t1(recursive_function, 3);
t1.join();
return 0;
}
浙公网安备 33010602011771号