adopt_lock参数究竟何时该用?90%开发者忽略的lock_guard高级用法

第一章:adopt_lock参数究竟何时该用?

在C++多线程编程中,`std::adopt_lock` 是一个常被忽视但极具用途的枚举值,它用于指示互斥量的构造函数或锁管理类(如 `std::lock_guard` 或 `std::unique_lock`)当前线程已经持有锁,无需再次加锁。

adopt_lock的核心用途

当开发者手动调用了互斥量的 `lock()` 方法后,若仍希望使用RAII机制自动释放锁,就必须使用 `std::adopt_lock`,否则将导致重复加锁甚至死锁。 例如,在显式加锁后构建 `std::lock_guard` 时:

std::mutex mtx;

mtx.lock(); // 手动加锁

// 使用 adopt_lock 表示锁已被持有
std::lock_guard<std::mutex> guard(mtx, std::adopt_lock);

// 离开作用域时,guard 会自动释放锁,不会再次调用 lock()
上述代码中,`std::adopt_lock` 告诉 `std::lock_guard`:互斥量已加锁,请仅负责解锁。若省略该参数,程序行为未定义。
适用场景分析
  • 跨多个函数传递已加锁状态
  • 配合条件变量或复杂同步逻辑,避免重复锁定
  • 实现细粒度锁控制的同时保留异常安全
以下表格展示了不同锁构造方式的行为差异:
构造方式是否尝试加锁是否要求已持有锁
std::lock_guard(mtx)是否
std::lock_guard(mtx, std::adopt_lock)否是
正确使用 `std::adopt_lock` 能有效提升代码安全性与可读性,尤其是在复杂的同步流程中,它是实现精确资源管理的关键工具。

第二章:深入理解lock_guard与adopt_lock机制

2.1 lock_guard的基本原理与构造行为

自动锁管理机制

std::lock_guard 是 C++ 标准库中用于管理互斥量(mutex)的 RAII 模板类。其核心原理是在构造时自动加锁,析构时自动释放锁,确保临界区的线程安全。


std::mutex mtx;
void critical_section() {
    std::lock_guard<std::mutex> guard(mtx); // 构造时锁定
    // 执行临界操作
} // guard 离开作用域,自动析构并解锁

上述代码中,lock_guard 在构造函数内调用 mtx.lock(),析构时调用 mtx.unlock(),避免手动加解锁可能引发的死锁或遗漏。

构造行为特性
  • 构造函数接受一个互斥量引用,并立即加锁;
  • 不支持拷贝或移动语义,防止锁所有权被误传递;
  • 无延迟加锁能力,构造即锁定。

2.2 adopt_lock参数的设计意图与语义解析

设计初衷与使用场景
`adopt_lock` 是 C++ 标准库中用于互斥量(mutex)管理的一个特化标记类型,其核心设计意图在于支持“已锁定前提下的所有权转移”。该机制允许线程在已持有锁的前提下,安全地将锁的所有权交由 `std::lock_guard` 或 `std::unique_lock` 管理,避免重复加锁引发未定义行为。
语义解析与代码示例
std::mutex mtx;
mtx.lock(); // 手动加锁

// 使用 adopt_lock 表明锁已被持有
std::lock_guard guard(mtx, std::adopt_lock);
上述代码中,`std::adopt_lock` 作为构造参数传入,通知 `lock_guard` 对象:互斥量已处于锁定状态,析构时仅释放所有权而不重新加锁。这确保了资源管理的正确性与异常安全性。
  • 必须确保调用前互斥量已被当前线程锁定
  • 避免因双重加锁导致死锁或未定义行为

2.3 已持有锁时的资源管理陷阱分析

在并发编程中,线程持有锁期间若未妥善管理资源,极易引发死锁、资源泄漏或性能退化。
常见陷阱类型
  • 在锁保护区域内执行阻塞操作(如I/O)
  • 持有锁时调用外部不可控函数
  • 嵌套加锁导致死锁
代码示例与分析
mu.Lock()
defer mu.Unlock()

// 危险:网络请求可能长时间阻塞
resp, err := http.Get("https://example.com")
if err != nil {
    return err
}
defer resp.Body.Close()
上述代码在持有互斥锁期间发起HTTP请求,可能导致其他goroutine长时间等待。建议将耗时操作移出临界区,仅在必要时保护共享数据访问。
规避策略
通过缩小临界区范围、使用读写锁分离读写操作、以及引入上下文超时机制,可显著降低资源管理风险。

2.4 adopt_lock在多线程协作中的典型场景

锁的移交与线程安全控制
在复杂的多线程协作中,adopt_lock常用于已知互斥量已被当前线程锁定的场景,避免重复加锁导致死锁。典型应用是在封装线程安全对象时,构造函数接收已锁定的互斥量。
std::mutex mtx;
mtx.lock();
std::lock_guard guard(mtx, std::adopt_lock);
上述代码中,mtx.lock()由外部显式调用,std::adopt_lock告知lock_guard:互斥量已锁定,仅接管所有权,析构时自动释放。此机制保障了跨函数或模块的锁状态一致性。
典型使用场景
  • 异步任务初始化时共享资源的锁定传递
  • 条件变量配合中已持有锁的线程唤醒其他等待线程
  • 实现细粒度锁管理的容器类设计

2.5 错误使用adopt_lock导致的死锁案例剖析

在C++多线程编程中,std::adopt_lock用于指示互斥量已由当前线程锁定,但若使用不当极易引发死锁。
典型错误场景
以下代码展示了误用adopt_lock的情形:

std::mutex mtx;
void bad_usage() {
    std::lock_guard lk(mtx, std::adopt_lock); // 危险!未先锁定
}
该代码假设mtx已被锁定,但实际并未加锁,导致未定义行为。若其他线程同时访问共享资源,可能引发竞争或死锁。
正确使用模式
应确保互斥量在传递adopt_lock前已被显式锁定:

std::lock_guard lg(mtx);
// ... 其他操作
std::lock_guard adopted(mtx, std::adopt_lock); // 安全
此时,第二个lock_guard仅接管已持有的锁,避免重复锁定。

第三章:adopt_lock的正确应用场景实践

3.1 条件锁获取后移交所有权的安全封装

在并发编程中,条件锁的持有与资源所有权的转移需严格同步,避免竞态条件和资源泄漏。
安全移交的核心机制
通过封装条件变量与互斥锁的组合操作,确保仅当锁被成功获取后,才允许所有权转移。典型实现如下:

type SafeResource struct {
    mu    sync.Mutex
    cond  *sync.Cond
    data  *Resource
    owner string
}

func (sr *SafeResource) Transfer(newOwner string) {
    sr.mu.Lock()
    defer sr.mu.Unlock()
    for sr.data == nil {
        sr.cond.Wait() // 等待资源就绪
    }
    sr.owner = newOwner // 安全移交
}
上述代码中,sr.mu.Lock() 保证了临界区的独占访问,cond.Wait() 在释放锁的同时等待条件满足,唤醒后自动重新获取锁,确保 data 非空时才能执行移交。
关键保障点
  • 条件等待必须在锁保护下进行
  • 所有权变更须原子化完成
  • 避免虚假唤醒导致的状态错乱

3.2 异常安全下的锁资源转移策略

在多线程环境中,异常可能中断正常的锁释放流程,导致资源泄漏或死锁。为确保异常安全,必须采用RAII(Resource Acquisition Is Initialization)机制管理锁的生命周期。
锁的自动转移与所有权管理
通过智能指针和移动语义,可实现锁资源的安全转移。以下示例使用C++11的std::unique_lock进行锁的传递:

std::mutex mtx;
std::unique_lock<std::mutex> acquire_lock() {
    std::unique_lock<std::mutex> lock(mtx);
    // 可能抛出异常的操作
    if (some_error()) throw std::runtime_error("error");
    return lock; // 支持移动,安全转移
}
该代码利用unique_lock的移动构造函数,在函数返回时安全转移锁所有权,即使异常发生,局部锁对象也会自动析构并释放互斥量。
异常安全保证等级
  • 基本保证:异常抛出后对象仍有效
  • 强保证:操作要么成功,要么回滚
  • 不抛异常保证:绝对安全
结合锁的延迟获取(deferred locking),可进一步提升异常安全性。

3.3 与其他互斥量操作的协同模式对比

在并发编程中,互斥量常与条件变量、读写锁等机制配合使用,以实现更精细的线程协作。
与条件变量的协同
互斥量通常与条件变量结合,用于线程间的通知与等待。例如在 Go 中:
mu.Lock()
for !condition {
    cond.Wait() // 自动释放锁并等待
}
// 执行临界区操作
mu.Unlock()
该模式确保线程仅在条件满足时继续执行,避免忙等待,提升效率。
与读写锁的对比
  • 互斥量:独占访问,适用于频繁写场景
  • 读写锁:允许多个读或单个写,适合读多写少场景
机制并发读并发写适用场景
互斥量否否高写频并发
读写锁是否读密集型任务

第四章:高级用法与性能优化建议

4.1 结合unique_lock实现灵活的锁传递

std::unique_lock 相较于 std::lock_guard,提供了更灵活的锁管理机制,支持延迟锁定、手动加解锁以及锁所有权的转移。

锁的传递与所有权控制

通过移动语义,unique_lock 可以在函数间安全传递锁的所有权,避免死锁并提升资源利用率。

std::mutex mtx;
void process_data(std::unique_lock<std::mutex> lock) {
    // 使用已持有的锁进行操作
    // lock 由调用方转移而来
}

void worker() {
    std::unique_lock<std::mutex> lock(mtx, std::defer_lock);
    lock.lock();
    process_data(std::move(lock)); // 转移锁所有权
}

上述代码中,std::defer_lock 表示构造时不立即加锁;std::move(lock) 将锁所有权传递给 process_data,确保临界区连续受控。

  • 支持条件变量配合使用
  • 可实现细粒度的加解锁控制

4.2 避免重复加锁的接口设计模式

在高并发系统中,重复加锁不仅浪费资源,还可能导致死锁。合理的接口设计应确保同一协程或线程对同一资源的多次加锁请求能安全处理。
可重入锁的设计思路
通过记录持有锁的goroutine标识和重入次数,实现可重入语义。以下为简化示例:

type ReentrantMutex struct {
    mu     sync.Mutex
    owner  int64          // 持有锁的goroutine ID
    count  int            // 重入次数
}

func (m *ReentrantMutex) Lock() {
    gid := getGoroutineID()
    m.mu.Lock()
    if m.owner == gid {
        m.count++
        m.mu.Unlock()
        return
    }
    for m.owner != 0 {
        m.mu.Unlock()
        runtime.Gosched()
        m.mu.Lock()
    }
    m.owner = gid
    m.count = 1
    m.mu.Unlock()
}
上述代码中,owner记录当前持有锁的goroutine ID,若相同goroutine再次请求,则仅递增count。避免了重复阻塞。
使用场景对比
场景普通互斥锁可重入锁
递归调用死锁安全执行
回调嵌套风险高可控

4.3 在高并发组件中采用adopt_lock的权衡

在高并发场景下,adopt_lock常用于已持有互斥锁的线程中,避免重复加锁开销。其核心优势在于性能优化,但需严格确保锁状态的一致性。
适用场景分析
  • 线程已明确持有互斥锁,如异常处理后的锁接管
  • 跨函数边界传递锁所有权的场景
  • 需减少重复加锁带来的系统调用开销
典型代码示例
std::mutex mtx;
mtx.lock();
// ... 执行临界区操作
std::lock_guard<std::mutex> guard(mtx, std::adopt_lock);
// 此时不会再次加锁,仅负责析构时释放
上述代码中,adopt_lock告知lock_guard互斥量已被锁定,构造时不执行lock(),仅在析构时调用unlock(),避免死锁。
风险与限制
风险类型说明
逻辑错误若未实际持有锁,使用adopt_lock将导致未定义行为
调试困难缺乏运行时检查,错误难以追踪

4.4 编译期检查与静态分析辅助编码规范

现代编程语言通过编译期检查和静态分析工具,在代码提交前即可发现潜在缺陷,显著提升代码质量。这类机制能在不运行程序的前提下分析语法结构、类型系统与调用关系,提前拦截空指针、资源泄漏等问题。
静态分析工具的作用场景
静态分析工具如 Go 的 go vet、Java 的 ErrorProne 或 Rust 的 Clippy,能识别代码异味与常见错误。例如,在 Go 中使用如下代码:

func main() {
    if x := true; x = true { // 注意:此处为赋值而非比较
        fmt.Println("reachable")
    }
}
该代码将触发 go vet 警告,因为条件判断中误用了赋值操作符,静态分析可在编译前捕获此类逻辑错误。
主流工具对比
语言工具检查能力
Gogo vet, staticcheck类型安全、 unreachable code
RustClippy惯用法建议、性能优化

第五章:结语:掌握adopt_lock,提升线程安全编程素养

理解 adopt_lock 的核心价值

在多线程编程中,std::adopt_lock 是一个常被忽视但极具实用性的工具。它用于告知互斥量的锁管理对象(如 std::lock_guard),当前线程已经持有该互斥量的锁,无需再次加锁。


std::mutex mtx;
mtx.lock(); // 手动加锁

// 使用 adopt_lock 避免重复加锁
std::lock_guard<std::mutex> lock(mtx, std::adopt_lock);

// 此时 lock 仅负责解锁,不进行加锁操作
典型应用场景分析
  • 跨函数边界传递锁状态:当锁在某个函数中获取,需在另一个函数中安全释放时,adopt_lock 可确保资源正确管理。
  • 与条件变量配合使用:在调用 wait() 前已持有锁的情况下,结合 adopt_lock 可避免死锁或未定义行为。
  • 封装复杂的同步逻辑:在实现自定义同步原语时,adopt_lock 提供了更精细的控制粒度。
常见误区与规避策略
误区后果解决方案
误用 adopt_lock 而未先加锁未定义行为,可能崩溃确保调用前已显式锁定互斥量
重复释放锁程序异常终止使用 RAII 管理生命周期
C++多线程编程实战:从std::thread到线程安全设计 并发编程是现代软件开发中提升性能的核心技术,它允许多个任务同时执行,从而充分利用多核CPU的计算能力。其基本原理是通过创建多个执行流(线程)来并行处理任务,关键技术包括线程同步、互斥锁和原子操作。在C++工程实践中,掌握多线程技术能显著提升服务端数据处理、图形界面响应等场景的性能。本文聚焦于C++11引入的std::thread库,深入解析其线程生命周期管理、数据竞争防范以及条件变量等同步机制,并结合互斥锁与RAII守卫等实战技巧,帮助开发者规避死锁、数据竞争等常见陷阱,构建高效可靠的并发程序。 阅读详情

相关推荐

C++11多线程之std::lock_guard和std::unique_lock

C++11多线程之std::lock_guard和std::unique_lock 在C++多线程对共享数据进行修改时,我们需要加互斥锁来保护数据被正确的读和写。C++提供了std::mutex,std::mutex在同一时间,只被一个线程拿到,而其他试图lock mutex的线程会被挂起(线程挂起的状态下CPU不会分给线程时间片,那么当前挂起的线程就会暂停运行。),直到该mutex被释放后,才有可能拿到mutex并继续执行。 没有mutex的例子 #include <thread> #in

跟随内心的渴望 2227

std::adopt_lock锁的使用

今天刚C++并发编程实战,看到一个lock_guard<std::mutex>l(mutex,std::adopt_lock);我就一直在想这个是什么东西,从字面意思理解,就是收养个锁,去msdn搜了搜,msdn是这样解释的,我也没看懂,后来看了几篇博客,大概理解了。 正文 adopt_mutex: adopt_lock确实是跟收养了个锁差不多,在test5不带参数的这个函数中,先上锁,然后托管给lock_guard这个类,这个类称为RALL(资源获取就是初始化),退出这个函数,lock_gu

dxgzg的博客 8638

C++并发之锁(std::lock_guard,std::unique_lock)

锁保护是通过使互斥对象始终处于锁定状态来管理互斥对象的对象。。在构造时,互斥对象被调用线程锁定,在析构时,互斥被解锁。它是最简单的锁,作为一个具有自动持续时间的对象特别有用,该对象会持续到其上下文结束。通过这种方式,它可以保证互斥对象在抛出异常时正确解锁。但请注意,lock_guard对象不会以任何方式管理互斥对象的生存期:互斥对象的持续时间应至少延长到锁定它的lock_guad被析构为止。唯一锁是一个在锁定和未锁定两种状态下管理具有唯一所有权的互斥对象的对象。

flysnow010的博客 1711

C++ 多线程std::lock_gurad和std::adopt_lock_t

首先,std::lock_gurad获取的是引用,当我们给定一个adopt_lock_t的时候,就是说我们承诺我们给的锁已经上锁了,不用二次上锁,如果不给的话,那就是给给定的锁上锁;我之前了解过lock_guard,但是看见代码中他的构造函数的时候,心想std::adopt_lock是什么东西?注意:adopt_lock_t只是一个空结构体,只是起到标记的作用,并没有什么内容上的作用;

weixin_62953519的博客 1024

隐语第四课:快速上手-SecretFlow的安装和部署

隐语课程,继续学习隐私计算技术

weixin_41467180的博客 2509

《机器人学一(Robotics(1))》_台大林沛群 第 3 周 【机械手臂 顺运动学】Quiz 3

的方向,旋转方向与四指弯曲方向相反,为负, α为 -90。的方向,旋转方向与四指弯曲方向相反,为负, α为 -90。bug 的图 要求解的 i 位置有误 两套 题目?B. 第2个 坐标系 的原点位置 不便于 计算;上面的正确,后两题 有误, 不知道问题在哪里。标准部分, 前面的更常用,这种仅作为 了解。还是计算过程中保留两位有效数字 不符合。2、确定 旋转角 α 正负的右手定则。1、确定坐标系方向的右手定则。可相交,距离为 0。A: 右手拇指指向。小数点后两位,不符合。

weixin_46034116的博客 1243

【C++11并发与多线程笔记(4)】

C++11并发与多线程笔记(4)unique_lock详解unique_lock取代lock_guardunique_lock的第二个参数std::adopt_lockstd::try_to_lockstd::defer_lockunique_lock的成员函数lock()unlocktry_lockrelease()unique_lock所有权的传递 unique_lock详解 unique_lock取代lock_guard unique_lock的第二个参数 std::adopt_lock std::t

qq_41855185的博客 1525

深入解析SVPWM七段式与五段式调制的电压波形差异及优化策略

本文深入解析了SVPWM七段式与五段式调制在相电压和线电压波形上的核心差异。七段式波形对称、谐波含量低,适合追求静音与性能的场景;五段式开关次数少、损耗低,适用于对效率与散热要求高的应用。文章提供了基于谐波与损耗权衡的优化策略与选型指南。

weixin_29216957的博客 440

多线程共享数据的保护+互斥量概念、用法、死锁演示及解决详解(std::lock()、std::adopt_lock)

#include <list> #include <thread> class A { public: //把收到的消息(玩家命令)入到一个队列的线程 void inMsgRecvQueue() { for (int i = 0;i < 100000;++i) { cout << "inMsgRecvQueue()执行,插入一个元素" << i << endl;

HITXJ的博客 1275

基于多时间尺度的电动汽车光伏充电站联合分层优化调度(Matlab代码实现)

该研究提出了一种电动汽车光伏充电站的分层优化调度方法,采用日前-日内两阶段协同优化框架。日前阶段通过混合整数规划对多充电站进行全局优化,以平抑电网波动和降低购电成本为目标;日内阶段基于实时数据,采用NSGA-II等算法动态分配充电功率。该方法实现了光伏高效消纳、成本节约和电网负荷平衡的有效统一。

zhangxd212489的博客 519

告别零散脚本:用Playwright+Pytest+Yaml+Allure搭建可维护的UI自动化项目

UI自动化测试是软件质量保障的关键环节,其核心在于模拟用户操作,对Web应用界面进行功能验证。传统的脚本堆砌方式常因代码耦合度高、维护成本大而难以为继。工程化解决方案通过分离关注点,将测试逻辑、数据和配置解耦,从而显著提升项目的可读性、可维护性和可扩展性。其技术价值在于构建可持续运行的自动化资产,而非一次性脚本。典型的应用场景包括Web应用的回归测试、兼容性测试及CI/CD流水线中的质量门禁。本文以Playwright、Pytest、Yaml和Allure为核心技术栈,详细阐述了如何从项目架构、页面对象模型

weixin_42529328的博客 299

lock_guard adopt_lock用法全解析,90%开发者忽略的关键细节

深入解析lock_guard的adopt_lock参数用法,揭示多线程编程中避免重复加锁的关键技巧。适用于已持有互斥锁的场景,确保资源安全释放,提升代码健壮性。掌握这一细节,避免常见死锁问题,值得收藏。

InstrIsle的博客 408

符合DO-178C和DO-331的机载软件研制体系

DO-178C的核心要求软件开发生命周期:DO-178C定义了软件开发的生命周期过程,包括需求获取、设计、实现、验证和确认等。它为机载软件开发提供了一套系统化的指导,确保在开发过程中考虑安全性和可靠性。安全等级(DAL):根据系统的重要性,DO-178C将软件划分为不同的开发保障等级(DAL A到E),DAL A的要求最为严格,适用于关键安全功能,而DAL E的要求较低,适用于非关键功能。DO-178C在非基于模型软件开发中的应用。

qq_41854911的博客 980

lock_guard与adopt_lock的隐秘细节,90%开发者都忽略了

深入解析C++ lock_guard 的 adopt_lock 机制,揭示其在已持有锁时避免重复加锁的关键用途。适用于条件复杂或异常安全的场景,提升代码健壮性。掌握这一隐秘特性,让并发控制更精准高效,值得收藏。

ProcePerch的博客 164

无人机视角下基于YOLOv5/v8/v10的车辆检测系统:从算法原理到UI界面实战

随着无人机技术的普及和智慧城市的发展,无人机视角下的车辆检测在交通监控、战场侦察、灾害救援等领域展现出巨大的应用价值。然而,无人机航拍图像存在目标尺度小、视角多变、背景复杂等挑战。本文深入探讨了如何利用YOLOv5、YOLOv8、YOLOv10三个代表性目标检测算法,构建一套完整的无人机车辆检测系统。文章不仅详细解析了各版本YOLO的核心技术演进,还提供了从数据集准备、模型训练、性能评估到基于PyQt5/PySide6的图形界面开发的完整代码实现。通过本文,读者将能够掌握构建无人机实时车辆检测系统的全流程技

YOLO 172

把 SAP BTP Destination 写进 MTA:一段 com.sap.application.content 配置背后的部署编排学

MTA内容模块解析:SAP BTP中的声明式部署机制 本文详细解析了mta.yaml中com.sap.application.content模块在SAP BTP云环境中的作用。该模块通过声明式配置实现内容投递,无需编译或部署代码。核心功能包括: Destination创建:通过content-target:true标识将配置投递到Destination服务 HTML5应用部署:将静态资源投递到HTML5 Application Repository 安全集成:配置XSUAA服务实现OAuth2用户令牌交换

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 165

C++标准线程库-全面讲解

本文全面介绍C++11到C++20的多线程编程特性,涵盖八大核心模块:线程管理(std::thread)、互斥锁(std::mutex家族)、线程同步(std::condition_variable)、异步编程(std::future)、原子操作(std::atomic)以及C++20新增特性(std::jthread、信号量、屏障)。重点解析了线程创建与管理、互斥锁类型选择、RAII锁包装器使用、条件变量等待/通知机制、异步任务处理等关键技术,并对比了不同锁的特性差异。

我的博客主要是用来给我自己复习的,主要是上传一些知识点,小型的项目和功能模块,如果有什么问题或错误麻烦联系我! 893

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++个人笔记

C++笔记

qq_54046894的博客 799

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C++ 并发指南 std::lock

C++11 标准为我们提供了两种基本的锁类型,分别如下: std::lock_guard,与 Mutex RAII 相关,方便线程对互斥量上锁。 std::unique_lock,与 Mutex RAII 相关,方便线程对互斥量上锁,但提供了更好的上锁和解锁控制。 另外还提供了几个与锁类型相关的 Tag 类,分别如下: std::adopt_lock_t,一个空的标记类,定义如下: struct adopt_lock_t {}; 该类型的常量对象adopt_lock。 adopt_lock 是一个

qq_24649627的博客 1856

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++多线程(二)---- mutex互斥量、lock_guard<mutex>、unique_lock<mutex>的使用和各种方式加锁的区别(详细解析~~~)

C++多线程(二)---- 多线程资源竞争、std::mutex互斥量、lock_guard、unique_lock的使用和各种方式加锁的区别(详细解析~~~)

weixin_43978744的博客 5136

c++11 std::defer_lock, std::try_to_lock, std::adopt_lock

std::adopt_lock Value used as possible argument to the constructor of unique_lock or lock_guard. unique_lock objects constructed with adopt_lock do not lock the mutex object on construction, assuming instead that it is already locked by the current thread

李白 3368

3 —— 多线程的同步和异步

一 创建多个线程 #include <iostream> #include <thread> #include <vector> using namespace std; // 线程入口函数 void myprint(int num) { cout << this_thread::get_id() << "thread star...

baboon_chen 1991

52 C++ unique_lock 替代 lock_guard 详解

返回它所管理的mutex对象指针,并释放所有权,也就是说:这个uique_lock 和mutex不在有关系,如果这时候mutex处理加锁状态,则要程序员自己对这个mutex进行unlock操作。我们会尝试用mutex的lock()去锁定这个mutex,但是如果没有锁定成功,我也会立即返回,并不会阻塞在这里。好处是不用管unlock(),在 sbguard1的析构函数调用的时候,会调用 mymutex1的析构函数。之前的lock_guard是要在析构函数调用的时候,才会调用 mutex.unlock();

hunandede的博客 1236

adopt_lock 和 defer_lock 的区别

下面三种方法在同时锁住多个互斥量时,是等价的先同时 lock,再创建 guard先创建 guard, 再同时 lock使用 scoped_lockTypeEffect(s)

... 2998

C++日记——Day40:互斥量概念、用法、死锁演示及解决详解、std::lock()模板、std::lock_guard的std::adopt_lock参数

互斥量基本概念 保护共享数据,某个线程 用代码把共享数据锁住,其它想操作共享数据线程必须等待解锁 基本过程:锁定,操作,解锁 互斥量:是个类对象。理解成一把锁,多个线程尝试用lock()函数来加锁这把锁头时,只有一个线程能锁定成功。(成功的标志是lock()函数返回),如果没锁成功,那么流程卡在lock()这里不断尝试去锁这把锁头。 慎用lock()保护共享数据不多也不少,少了达不到效果,...

weixin_38278993的博客 636

C++11 多线程(中)

lock()内的两个互斥量,对顺序没有要求。unique_guard()可以取代lock_gaurd(),unique_guard()可能会占用更多的内存,但是unique_guard()的使用会比lock_guard()更灵活,上面我么说到过lock_guard()的第二个参数adopt_lock,当然unique_guard()也支持这个参数,和lock_guard()的作用是一样的,下面我们就来看看unique_guard()的不同的第二个参数。

qq_66157971的博客 353
上一篇: C++中析构函数为何能成为纯虚函数?底层原理大揭秘
下一篇: C++高阶编程实战:如何写出可编译期求值的constexpr构造函数?
SimProceed
博客等级 码龄1年 146粉丝 2011原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值