C++有哪几种线程锁

在C++中,线程同步和锁机制主要通过标准库中的<mutex>、<shared_mutex>(C++17引入)等头文件提供。这些库提供了多种锁机制来管理对共享资源的访问,以防止数据竞争和确保线程安全。

下面列举了几种常见的锁类型,并给出每种锁的示例:

01、std::mutex

std::mutex是最基本的互斥锁,用于保护共享数据,防止多个线程同时访问同一资源。

示例:

#include <iostream>  
#include <thread>  
#include <mutex>  
  
std::mutex g_mtx;  
  
void print_block(int n, char c) {  
    g_mtx.lock();  
    for (int i = 0; i < n; ++i) { std::cout << c; }  
    std::cout << '\n';  
    g_mtx.unlock();  
}  
  
int main() {  
    std::thread th1(print_block, 50, '*');  
    std::thread th2(print_block, 50, '$');  
  
    th1.join();  
    th2.join();  
  
    return 0;  
}

02、std::lock_guard

std::lock_guard是一个RAII(Resource Acquisition Is Initialization)风格的锁包装器,它在构造时自动加锁,在析构时自动解锁,简化了锁的管理。

示例:

#include <iostream>  
#include <thread>  
#include <mutex>  
  
std::mutex g_mtx;  
  
void print_block(int n, char c) {  
    std::lock_guard<std::mutex> lck(g_mtx);  
    for (int i = 0; i < n; ++i) { std::cout << c; }  
    std::cout << '\n';  
}  
  
int main() {  
    std::thread th1(print_block, 50, '*');  
    std::thread th2(print_block, 50, '$');  
  
    th1.join();  
    th2.join();  
  
    return 0;  
}

03、std::unique_lock

std::unique_lock比std::lock_guard更灵活,支持延迟锁定、条件变量等高级用法。

示例:

#include <iostream>  
#include <thread>  
#include <mutex>  
  
std::mutex g_mtx;  
  
void print_block(int n, char c) {  
    std::unique_lock<std::mutex> lck(g_mtx, std::defer_lock); // 延迟锁定  
    lck.lock();  
    for (int i = 0; i < n; ++i) { std::cout << c; }  
    std::cout << '\n';  
    lck.unlock();  
}  
  
int main() {  
    std::thread th1(print_block, 50, '*');  
    std::thread th2(print_block, 50, '$');  
  
    th1.join();  
    th2.join();  
  
    return 0;  
}

04、std::shared_mutex和std::shared_lock(C++17)

std::shared_mutex允许多个读者同时访问资源,但写者访问时必须是独占的。这对于读多写少的场景非常有用。

std::shared_lock 用于管理对共享互斥量(std::shared_timed_mutex 或 std::shared_mutex)的访问,允许多个线程同时以共享模式锁定互斥量,但只允许一个线程以独占模式锁定它。

示例:

#include <iostream>  
#include <thread>  
#include <shared_mutex>  
  
std::shared_mutex g_smtx;  

void reader(int id) {  
    std::shared_lock<std::shared_mutex> lck(g_smtx);  
    std::cout << "Reader " << id << " is reading\n";  
}  
  
void writer(int id) {  
    std::unique_lock<std::shared_mutex> lck(g_smtx);  
    std::cout << "Writer " << id << " is writing\n";  
}  
  
int main() {  
    std::thread t1(reader, 1);  
    std::thread t2(reader, 2);  
    std::thread t3(writer, 1);  
  
    t1.join();  
    t2.join();  
    t3.join();  
  
    return 0;  
}

-End-

#想了解更多精彩内容,关注下方公众号。

本人小杨哥:

超20年C++开发经验,独立软件开发;著名开源产品高并发C++应用服务器MYCP作者;开源企业即时通讯软件Entboost首席架构师;开发有【WordBN字远笔记】等共享软件产品。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天恩软件工作室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值