C++中互斥锁用于保护共享数据,防止多线程竞争。std::mutex需配合std::lock_guard或std::unique_lock使用,前者自动加解锁,后者支持延迟和手动控制。还提供recursive_mutex、timed_mutex等类型适应递归和超时场景,建议使用RAII机制管理锁,减小锁粒度,避免死锁。

在C++中,互斥锁(mutex)用于保护共享数据,防止多个线程同时访问造成数据竞争。标准库提供了多种互斥锁类型和配套的锁管理工具,使用起来既安全又方便。
1. 基本互斥锁:std::mutex
最常用的互斥锁是 std::mutex。它本身不提供自动加锁和解锁功能,需要配合 std::lock_guard 或 std::unique_lock 使用,以确保异常安全。
示例代码:
#include #include #include std::mutex mtx;void print_block(int n, char c) { std::lock_guard lock(mtx); // 自动加锁 for (int i = 0; i < n; ++i) { std::cout << c; } std::cout << 'n'; // 自动解锁(离开作用域)}int main() { std::thread t1(print_block, 10, '*'); std::thread t2(print_block, 10, '-'); t1.join(); t2.join(); return 0;}
在这个例子中,std::lock_guard 在构造时加锁,析构时自动解锁,避免了忘记解锁或异常导致死锁的问题。
2. 灵活控制:std::unique_lock
如果需要更灵活的操作,比如延迟加锁、手动解锁或条件变量配合,可以使用 std::unique_lock。
特点:
支持延迟加锁(传入 std::defer_lock) 可随时调用 lock() 和 unlock() 可用于条件变量(std::condition_variable)示例:
std::mutex mtx;std::unique_lock lock(mtx, std::defer_lock);// 其他操作...lock.lock(); // 手动加锁// 访问共享资源lock.unlock(); // 手动解锁
3. 其他类型的互斥锁
C++标准还提供了其他互斥锁类型,适用于不同场景:std::recursive_mutex:允许同一线程多次加锁,适合递归调用 std::timed_mutex:支持超时加锁(try_lock_for, try_lock_until) std::recursive_timed_mutex:递归 + 超时功能
带超时的示例:
立即学习“C++免费学习笔记(深入)”;
std::timed_mutex t_mtx;if (t_mtx.try_lock_for(std::chrono::seconds(1))) { // 成功获取锁 // 操作共享资源 t_mtx.unlock();} else { // 超时未获取到锁 std::cout << "Lock timeoutn";}
4. 注意事项与最佳实践
使用互斥锁时需注意以下几点:尽量使用 RAII(如 lock_guard、unique_lock),避免手动调用 lock/unlock 锁的粒度要小,只保护真正需要同步的代码段 避免在持有锁时执行耗时操作(如I/O、网络请求) 防止死锁:多个锁时保持一致的加锁顺序基本上就这些。掌握好 mutex 配合 lock_guard 或 unique_lock 的使用,就能有效保护多线程下的共享数据安全。
以上就是c++++中如何使用互斥锁_c++互斥锁使用方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1477837.html
微信扫一扫
支付宝扫一扫