C++学习——递归锁(std::recursive_mutex path_mutex_)

std::recursive_mutex path_mutex_是 C++ 标准库中的一个递归互斥锁(recursive mutex)对象。它的作用是提供线程同步机制,确保多个线程不会同时访问共享资源,从而避免数据竞争和不一致性问题。

实例:std::recursive_mutex path_mutex_;


1. 什么是 std::recursive_mutex

  • std::recursive_mutex 是一种特殊的互斥锁,允许同一线程多次对同一个互斥锁加锁。
  • 普通互斥锁(std::mutex)如果被同一线程多次加锁,会导致死锁。而 std::recursive_mutex 可以避免这种情况。

2. path_mutex_ 的作用

  • 线程安全path_mutex_ 用于保护共享资源(例如某个路径或数据结构),确保同一时间只有一个线程可以访问该资源。
  • 递归加锁:如果某个线程已经持有锁,它可以再次加锁而不会导致死锁。这在递归函数或嵌套调用中非常有用。

3. 使用场景

假设有一个共享资源(例如一个路径或文件系统路径),多个线程可能会同时访问或修改它。为了确保线程安全,可以使用 std::recursive_mutex 来保护该资源。

示例代码
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>

std::recursive_mutex path_mutex_;  // 递归互斥锁
std::string shared_path = "/default/path";  // 共享资源

void update_path(const std::string& new_path) {
    std::lock_guard<std::recursive_mutex> lock(path_mutex_);  // 加锁
    shared_path = new_path;
    std::cout << "Path updated to: " << shared_path << std::endl;
}

void nested_update_path(const std::string& new_path) {
    std::lock_guard<std::recursive_mutex> lock(path_mutex_);  // 再次加锁
    update_path(new_path);  // 嵌套调用
}

int main() {
    std::thread t1(nested_update_path, "/new/path/1");
    std::thread t2(nested_update_path, "/new/path/2");

    t1.join();
    t2.join();

    return 0;
}
代码说明
  • path_mutex_ 用于保护 shared_path,确保多个线程不会同时修改它。
  • nested_update_path 函数中,path_mutex_ 被多次加锁(递归加锁),但由于使用的是 std::recursive_mutex,不会导致死锁。

4. std::recursive_mutex 的特点

  • 递归加锁:同一线程可以多次加锁,但必须解锁相同次数。
  • 性能开销:由于需要记录加锁次数,std::recursive_mutex 的性能略低于普通 std::mutex
  • 适用场景:适合需要递归加锁的场景,例如递归函数或嵌套调用。

5. std::mutex 的区别

特性std::mutexstd::recursive_mutex
同一线程多次加锁导致死锁允许
性能更高略低
适用场景简单加锁场景递归或嵌套加锁场景

6. 注意事项

  • 解锁次数:必须确保加锁和解锁的次数匹配,否则可能导致死锁或未定义行为。
  • 避免滥用:如果不是必须使用递归锁,优先使用 std::mutex,因为它的性能更好。

总结

std::recursive_mutex path_mutex_; 是一个递归互斥锁,用于保护共享资源,确保线程安全。它允许同一线程多次加锁,适合递归或嵌套调用的场景。在设计多线程程序时,合理使用互斥锁可以有效避免数据竞争问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.小墨迹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值