文章

std::recursive_mutex 简单用法

std::recursive_mutex 是 c++ 标准库中的可递归互斥量,它与 std::mutex 类似,但允许同一个线程多次对互斥量进行加锁操作,而不会导致死锁。这意味着线程可以在持有互斥量的情况下再次对其进行加锁,而不会被阻塞。递归互斥量非常适用于需要在嵌套函数或递归调用中使用互斥量的情况,确保线程安全性的同时保持灵活性。话不多说,看下面这种情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
std::mutex mtx;

void func1()
{
    mtx.lock();
    // do something
    mtx.unlock();
}

void func2()
{
    mtx.lock();
    func1();
    // do something
    mtx.unlock();
}

当出现上面这种情况的时候,就会陷入死锁,递归锁就可以解决这个问题,它允许在同一线程反复加锁,只要加锁次数和解锁次数相等就不会陷入死锁。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <mutex>
#include <thread>
#include <iostream>

std::recursive_mutex rmtx;

void func1()
{
    mtx.lock();
    std::cout << "func1" << std::endl;
    mtx.unlock();
}

void func2()
{
    mtx.lock();
    std::cout << "func2" << std::endl;
    func1();
    mtx.unlock();
}

int main()
{
    std::thread t1(func1);
    std::thread t2(func2);

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

    return 0;
}
本文由作者按照 CC BY 4.0 进行授权

© ziqing. 保留部分权利。

纸上得来终觉浅,绝知此事要躬行!