文章

std::mutex 简单用法

std::mutex 是 c++ 里的一个互斥锁, 用于实现线程间的互斥访问,确保共享资源的安全性。在使用时,一旦 A 线程 lock 后,其他线程如果调用 lock 便会阻塞等待,直到 A 线程 unlock,其他线程如果不想阻塞等待,可以调用 try_lock, 它会尝试lock,失败后便返回。

示例

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <mutex>
#include <iostream>
#include <thread>
#include <unistd.h>

std::mutex mtx;

int main() {
    std::thread t1([](){
        sleep(2); // 休眠2秒,让t2线程先拿到锁
        while (true) {
            mtx.lock(); // t2或者t3持有锁未解锁t1就会一直阻塞
            std::cout<< "t1已上锁\n";
            mtx.unlock();
            std::cout<< "t1已解锁\n";
        }
    });

    std::thread t2([](){
        // 上锁后永远不解锁
        mtx.lock();
        while (true){
            std::cout<< "t2已上锁\n";
            sleep(1);
        }
        mtx.unlock();
    });
    
    std::thread t3([](){
        while (true) {
            // 尝试上锁,立刻返回,不阻塞,如果成功返回true,失败返回false
            auto ret = mtx.try_lock();
            if (ret) {
                std::cout<< "t3已上锁\n";
                mtx.unlock();
                std::cout<< "t3已解锁\n";
            } else {
                std::cout<< "t3上锁失败\n";
            }
            sleep(1);
        }
    });

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

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

© ziqing. 保留部分权利。

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