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;
}

  

递归锁

posted @ 2025-09-26 14:34  PKICA  阅读(15)  评论(0)    收藏  举报