c++的多线程的加锁和解锁的理解

本文介绍了C++中如何处理多线程并发访问共享资源的问题,重点讲解了std::mutex的基本使用、std::lock_guard的作用以及std::unique_lock的灵活性。这些工具对于确保线程安全和避免竞态条件至关重要。
摘要由CSDN通过智能技术生成

在C++中,多线程编程通常涉及到并发访问共享资源的问题。为了避免并发访问导致的数据不一致或竞争条件,我们需要对共享资源进行加锁和解锁操作。C++11标准引入了多线程支持,包括锁的概念,主要通过库中提供的各种互斥锁(mutex)来实现。

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

加锁:使用lock()方法可以加锁。
解锁:使用unlock()方法可以解锁。
cpp
Copy code
#include
#include
#include

std::mutex mtx; // 全局互斥锁

void print_block(int n, char c) {
mtx.lock();
for (int i = 0; i < n; ++i) { std::cout << c; }
std::cout << ‘\n’;
mtx.unlock();
}

int main() {
std::thread th1(print_block, 50, ‘*’);
std::thread th2(print_block, 50, ‘$’);

th1.join();
th2.join();

return 0;

}
2. std::lock_guard的使用
为了避免因异常等原因导致忘记解锁,C++提供了std::lock_guard对象,它是一个作用域锁,当作用域结束时自动释放锁。

cpp
Copy code
#include
#include
#include

std::mutex mtx; // 全局互斥锁

void print_block(int n, char c) {
std::lock_guardstd::mutex guard(mtx);
for (int i = 0; i < n; ++i) { std::cout << c; }
std::cout << ‘\n’;
// 当guard对象离开作用域时,自动调用其析构函数,解锁mtx
}

int main() {
std::thread th1(print_block, 50, ‘*’);
std::thread th2(print_block, 50, ‘$’);

th1.join();
th2.join();

return 0;

}
3. std::unique_lock的使用
std::unique_lock是一个比std::lock_guard更灵活的锁管理器,它允许我们延迟锁定、手动锁定和解锁,以及将锁的所有权从一个unique_lock转移到另一个。

cpp
Copy code
#include
#include
#include

std::mutex mtx; // 全局互斥锁

void print_block(int n, char c) {
std::unique_lockstd::mutex ulock(mtx, std::defer_lock); // 延迟锁定
// 做一些其他工作…
ulock.lock(); // 现在手动加锁
for (int i = 0; i < n; ++i) { std::cout << c; }
std::cout << ‘\n’;
// ulock对象离开作用域时自动释放锁
}

int main() {
std::thread th1(print_block, 50, ‘*’);
std::thread th2(print_block, 50, ‘$’);

th1.join();
th2.join();

return 0;

}
在实际应用中,根据需要选择合适的锁和管理方法是很重要的。std::lock_guard和std::unique_lock提供了自动的锁管理功能,能够减少直接使用std::mutex时可能遇到的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值