C++ Thead多线程std::lock_guard与 std::unique_lock有何区别---C++11多线程快速学习

lock_guard

std::lock_guard 是 C++ 标准库中的一种互斥量封装类,用于保护共享数据,防止多个线程同时访问同一资源而导致的数据竞争问题。

std::lock_guard 的特点如下:

  • 当构造函数被调用时,该互斥量会被自动锁定。

  • 当析构函数被调用时,该互斥量会被自动解锁。

  • std::lock_guard 对象不能复制或移动,因此它只能在局部作用域中使用。

 

std::unique_lock

std::unique_lock 是 C++ 标准库中提供的一个互斥量封装类,用于在多线程程序中对互斥量进行加锁和解锁操作。它的主要特点是可以对互斥量进行更加灵活的管理,包括延迟加锁、条件变量、超时等。

std::unique_lock 提供了以下几个成员函数:

  • lock():尝试对互斥量进行加锁操作,如果当前互斥量已经被其他线程持有,则当前线程会被阻塞,直到互斥量被成功加锁。

  • try_lock():尝试对互斥量进行加锁操作,如果当前互斥量已经被其他线程持有,则函数立即返回 false,否则返回 true

  • try_lock_for(const std::chrono::duration<Rep, Period>& rel_time):尝试对互斥量进行加锁操作,如果当前互斥量已经被其他线程持有,则当前线程会被阻塞,直到互斥量被成功加锁,或者超过了指定的时间。

  • try_lock_until(const std::chrono::time_point<Clock, Duration>& abs_time):尝试对互斥量进行加锁操作,如果当前互斥量已经被其他线程持有,则当前线程会被阻塞,直到互斥量被成功加锁,或者超过了指定的时间点。

  • unlock():对互斥量进行解锁操作。

除了上述成员函数外,std::unique_lock 还提供了以下几个构造函数:

  • unique_lock() noexcept = default:默认构造函数,创建一个未关联任何互斥量的 std::unique_lock 对象。

  • explicit unique_lock(mutex_type& m):构造函数,使用给定的互斥量 m 进行初始化,并对该互斥量进行加锁操作。

  • unique_lock(mutex_type& m, defer_lock_t) noexcept:构造函数,使用给定的互斥量 m 进行初始化,但不对该互斥量进行加锁操作。

  • unique_lock(mutex_type& m, try_to_lock_t) noexcept:构造函数,使用给定的互斥量 m 进行初始化,并尝试对该互斥量进行加锁操作。如果加锁失败,则创建的 std::unique_lock 对象不与任何互斥量关联。

  • unique_lock(mutex_type& m, adopt_lock_t) noexcept:构造函数,使用给定的互斥量 m 进行初始化,并假设该互斥量已经被当前线程成功加锁。

std::unique_lock 使用非常灵活方便,上述操作的使用方式将会在课程视频中作详细介绍。

 

分布式数据库 分布式数据库 分布式数据库数据库技术网络相结合的产物,分布式系统建立在 是数据库技术网络相结合的产物,分布式系统建立在 是数据库技术网络相结合的产物,分布式系统建立在 是数据库技术网络相结合的产物,分布式系统建立在 是数据库技术网络相结合的产物,分布式系统建立在 是数据库技术网络相结合的产物,分布式系统建立在 是数据库技术网络相结合的产物,分布式系统建立在 是数据库技术网络相结合的产物,分布式系统建立在 是数据库技术网络相结合的产物,分布式系统建立在 是数据库技术网络相结合的产物,分布式系统建立在 是数据库技术网络相结合的产物,分布式系统建立在 是数据库技术网络相结合的产物,分布式系统建立在 是数据库技术网络相结合的产物,分布式系统建立在 网上的 网上的 软件系统, 软件系统, 软件系统, 具有高度的 透明性,在分布式数据库系统中用户是感觉不到就好像操作具有高度的 透明性,在分布式数据库系统中用户是感觉不到就好像操作具有高度的 透明性,在分布式数据库系统中用户是感觉不到就好像操作具有高度的 透明性,在分布式数据库系统中用户是感觉不到就好像操作具有高度的 透明性,在分布式数据库系统中用户是感觉不到就好像操作具有高度的 透明性,在分布式数据库系统中用户是感觉不到就好像操作具有高度的 透明性,在分布式数据库系统中用户是感觉不到就好像操作具有高度的 透明性,在分布式数据库系统中用户是感觉不到就好像操作具有高度的 透明性,在分布式数据库系统中用户是感觉不到就好像操作具有高度的 透明性,在分布式数据库系统中用户是感觉不到就好像操作具有高度的 透明性,在分布式数据库系统中用户是感觉不到就好像操作是一个统的整体,即用户不须知道关系否分割、有无副本数据库存于哪台机器及操作 是一个统的整体,即用户不须知道关系否分割、有无副本数据库存于哪台机器及操作 是一个统的整体,即用户不须知道关系否分割、有无副本数据库存于哪台机器及操作 是一个统的整体,即用户不须知道关系否分割、有无副本数据库存于哪台机器及操作 是一个统的整体,即用户不须知道关系否分割、有无副本数据库存于哪台机器及操作 是一个统的整体,即用户不须知道关系否分割、有无副本数据库存于哪台机器及操作 是一个统的整体,即用户不须知道关系否分割、有无副本数据库存于哪台机器及操作 是一个统的整体,即用户不须知道关系否分割、有无副本数据库存于哪台机器及操作
### HBase安装方法 HBase 是一种分布式的 NoSQL 数据库,其安装过程相对复杂,但可以通过官方文档获得详细指导。为了确保顺利安装并运行 HBase,需要遵循以下要点: - 需要先安装 Java 环境以及 Hadoop 并设置好环境变量[^1]。 - 下载 HBase 安装包后解压到指定目录,并修改 `conf/hbase-site.xml` 文件中的配置项来适配本地或集群环境的需求[^2]。 完成上述步骤之后,启动 HBase 服务并通过浏览器访问管理界面 (http://localhost:16010),验证服务是否正常工作。 --- ### 基本操作指南 对于 HBase 的基本操作,主要通过命令行工具 **HBase Shell** 来实现。以下是几个常见的基础操作示例及其说明: #### 创建表 创建一张新表时,需要定义列族名称: ```bash create 'my_table', 'cf' ``` 此命令会创建名为 `my_table` 的表,并为其分配一个列族 `cf`。 #### 插入数据 向已存在的表中插入一条记录: ```bash put 'my_table', 'row1', 'cf:name', 'John Doe' ``` 这里将 RowKey 设置为 `row1`,并向列族 `cf` 中的子字段 `name` 赋予值 `'John Doe'`。 #### 查询数据 查询某条特定记录的内容: ```bash get 'my_table', 'row1' ``` 该语句返回对应于 `row1` 这一主键的所有属性及它们各自的最新版本值。 #### 删除数据 删除某个单元格的数据或者整行数据都可以轻松做到: ```bash delete 'my_table', 'row1', 'cf:name' ``` 这只会移除 `row1` 行里属于 `cf:name` 列的那个具体项目;如果想彻底清除整个 row,则可执行如下指令: ```bash deleteall 'my_table', 'row1' ``` 以上即是对 HBase 执行一些初步交互所需掌握的核心技能概述。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

weijia3624

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

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

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

打赏作者

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

抵扣说明:

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

余额充值