首页 > 其他分享 >std::unique_lock

std::unique_lock

时间:2024-10-06 18:00:46浏览次数:7  
标签:std unique lock 解锁 互斥 锁定

std::unique_lock 是 C++11 标准库中的一个类,提供了一种灵活的方式来管理互斥量(mutex)。
它比 std::lock_guard 更加灵活,允许在不同的作用域和不同的锁定策略之间进行选择。以下是对 unique_lock 的详细解释,包括其用途、使用方法和优点。

1. 定义

  • std::unique_lock 是一种 RAII(资源获取即初始化)风格的锁,它在构造时锁定给定的互斥量,并在析构时自动解锁。这确保了在离开作用域时,锁会被自动释放,从而避免死锁。

2. 用途

  • 用于保护共享资源,确保在多线程环境中,只有一个线程能够访问该资源。
  • 适合需要在多个地方手动控制锁定与解锁的场景,例如在条件变量中使用。
  • 可以与 std::condition_variable 一起使用,以便在等待条件变量时自动管理锁。

3. 如何使用

以下是使用 std::unique_lock 的基本步骤和示例代码:

示例代码

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cond_var;
int shared_data = 0;

void producer() {
    std::unique_lock<std::mutex> lock(mtx);  // 锁定互斥量
    shared_data = 42;                         // 修改共享数据
    std::cout << "Produced: " << shared_data << std::endl;
    cond_var.notify_one();                    // 通知消费者
} // 离开作用域时自动解锁

void consumer() {
    std::unique_lock<std::mutex> lock(mtx);  // 锁定互斥量
    cond_var.wait(lock, [] { return shared_data != 0; }); // 等待条件变量
    std::cout << "Consumed: " << shared_data << std::endl;
} // 离开作用域时自动解锁

int main() {
    std::thread t1(producer);
    std::thread t2(consumer);

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

    return 0;
}

4. 为什么要用它

  • 灵活性:与 std::lock_guard 相比,std::unique_lock 提供了更多的灵活性,支持以下功能:

    • 可以在构造时选择是否锁定互斥量。
    • 支持手动锁定和解锁:可以在需要时调用 lock()unlock() 方法。
    • 支持条件变量的等待:在等待条件变量时,可以传入 unique_lock,并在条件满足时自动解锁和重新锁定。
  • 避免死锁:由于 std::unique_lock 的 RAII 特性,确保在作用域结束时自动解锁,降低了因忘记解锁而引起死锁的风险。

  • 可以延迟锁定:你可以在构造 unique_lock 时不锁定互斥量,并在后面需要时再手动锁定。

5. 总结

  • std::unique_lock 是一种灵活且安全的互斥量管理方式,适合在复杂的多线程环境中使用。
    它不仅简化了锁的管理,还减少了编程错误的可能性,尤其是在涉及条件变量和复杂的锁定策略时。

标签:std,unique,lock,解锁,互斥,锁定
From: https://www.cnblogs.com/niumachen/p/18449247

相关文章

  • CSS display属性 inline-block flex grid
    CSSdisplayinline-block flexgrid=======================================CSS的display属性是一个核心属性,用于控制元素如何在页面布局中显示,包括其盒模型的行为。以下是display属性的一些常见值及其示例代码:1.block   说明:将元素变为块级元素,独占一行,可以设置宽高、......
  • BitLocker加密C盘时:启动时需要附加身份验证
    BitLocker加密C盘时:启动时需要附加身份验证BitLocker加密C盘时显示如下错误信息:此设备无法使用受信任的平台模块。管理员必须在操作系统卷的“启动时需要附加身份验证”策略中设置“没有兼容的TPM时允许BitLocker”选项。BitLocker加密C盘时:启动时需要附加身份验证解决办法:Wind......
  • stdio流缓冲区
    文件流缓冲区每个进程都各自维护一个文件流表,和文件描述符表类似,并且这些文件流都有自己对应的缓冲区缓冲区的设计就是为了减少磁盘io,加快io的速度缓冲区模式通过setvbuf或者setbuf两个函数设置缓冲区的模式无缓冲区就是禁用缓冲区的意思,这种模式下,就相当于直接调用write函......
  • VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 2.7 Dell HPE 联想定制版 9 月更新发
    VMwareESXi7.0U3qmacOSUnlocker&OEMBIOS2.7标准版和厂商定制版ESXi7.0U3标准版,Dell(戴尔)、HPE(慧与)、Lenovo(联想)、Inspur(浪潮)、Cisco(思科)、Fujitsu(富士通)、Hitachi(日立)、NEC(日电)OEM定制版请访问原文链接:https://sysin.org/blog/vmware-esxi-......
  • Java 中的 volatile和synchronized和 ReentrantLock区别讲解和案例示范
    在Java的并发编程中,volatile、synchronized和ReentrantLock是三种常用的同步机制。每种机制都有其独特的特性、优缺点和适用场景。理解它们之间的区别以及在何种情况下使用哪种机制,对提高程序的性能和可靠性至关重要。本文将详细探讨这三种机制的特性、使用场景及示例......
  • VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布
    VMwareESXi8.0U3bmacOSUnlocker&OEMBIOS2.7DellHPE定制版9月更新发布VMwareESXi8.0U3bmacOSUnlocker&OEMBIOS2.7标准版和厂商定制版ESXi8.0U3标准版,Dell(戴尔)、HPE(慧与)、Lenovo(联想)、IEITSYSTEMS(浪潮信息)、Cisco(思科)、Fujitsu(富士通)......
  • WPF Calendar DisplayMode SelectionMode FirstDayOfWeek Start End BlackoutDates
    //xaml<Windowx:Class="WpfApp427.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......
  • 【翻译】实现 Blocked Floyd-Warshall 用于解决所有对最短路径问题 C# 实现
    【翻译】实现BlockedFloyd-Warshall用于解决所有对最短路径问题C#实现2024-09-2911:13  沉睡的木木夕 阅读(0) 评论(0)  编辑  收藏  举报介绍在之前的帖子中,我们实现了Floyd-Warshall(弗洛伊德-沃沙尔算法)(四种变体)以及路由重建算法。在这些帖子中,我们探讨......
  • GaussDB数据库SQL系列-LOCK TABLE
    一、前言GaussDB是一款高性能、高可用的分布式数据库,广泛应用于各类行业和场景。在GaussDB中,锁是实现并发控制的关键机制之一,用于协调多个事务之间的数据访问,确保数据的一致性和完整性。本文将围绕GaussDB数据库的LOCKTABLE做一简单介绍。二、GaussDB数据库的锁GaussDB提供了......
  • 【翻译】实现 Blocked Floyd-Warshall 用于解决所有对最短路径问题 C# 实现
    介绍在之前的帖子中,我们实现了Floyd-Warshall(弗洛伊德-沃沙尔算法)(四种变体)以及路由重建算法。在这些帖子中,我们探讨了所有对最短路径问题的基本概念、内存中的数据表示、并行性、向量化以及如何将算法调整为适应数据特性。在本帖中,我们将继续我们的旅程,探索一种更高效的方法来解......