关于unique_lock和lock_guard混用的疑问

slwj slwj 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
各位好,看下面代码遇到两个问题:

1)为何unique_lock和lock_guard混用?条件变量不是只能和unique_lock配合使用吗

2)为何两段代码都要用花括号括起来,是说明lk的作用域吗?如下:

// send data to the worker thread
{
std::lock_guard<std::mutex> lk(m);
ready6 = true;
std::cout << "main() signals data ready for processing\n";
}

和

// wait for the worker
{
std::unique_lock<std::mutex> lk(m);
cv6.wait(lk, []{return processed; });
}


多谢各位!

源程序如下:


#include <iostream>
#include <chrono>
#include <mutex>
#include <condition_variable>
#include <string>
#include <thread>
#include <atomic>

using namespace std;
std::mutex m;
std::condition_variable cv6;
std::string data;
bool ready6 = false;
bool processed = false;

static void worker_thread()
{
// Wait until main() sends data
std::unique_lock<std::mutex> lk(m);
cv6.wait(lk, []{return ready6; });

// after the wait, we own the lock.
std::cout << "Worker thread is processing data\n";
data += " after processing";

// Send data back to main()
processed = true;
std::cout << "Worker thread signals data processing completed\n";

// Manual unlocking is done before notifying, to avoid waking up
// the waiting thread only to block again (see notify_one for details)
lk.unlock();
cv6.notify_one();
}

int main()
{
std::thread worker(worker_thread);

data = "Example data";
// send data to the worker thread
{
std::lock_guard<std::mutex> lk(m);
ready6 = true;
std::cout << "main() signals data ready for processing\n";
}
cv6.notify_one();

// wait for the worker
{
std::unique_lock<std::mutex> lk(m);
cv6.wait(lk, []{return processed; });
}
std::cout << "Back in main(), data = " << data << '\n';

worker.join();

return 0;
}
...全文

相关推荐

unique_lock详解[项目源码]

本文详细介绍了C++中的unique_lock类模板,它是比lock_guard更灵活的互斥量管理工具。文章首先对比了unique_lock与lock_guard的差异,指出unique_lock在灵活性和功能上的优势,同时提到其在效率和内存上的轻微劣势。接着,文章深入讲解了unique_lock的多种使用方式,包括其构造函数的不同参数(如std::adopt_lock、std::try_to_lock和std::defer_lock),以及其成员函数(如lock、unlock、try_lock和release)的具体用法。此外,文章还通过代码示例展示了unique_lock所有权的传递(转移)方法,包括使用std::move和返回unique_lock对象。这些内容为开发者提供了在多线程编程中更灵活地管理互斥量的工具和技巧。

c7d8e

C++11 并发指南之Lock 详解

主要介绍了C++11 并发指南之Lock 详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

weixin_38703794

C++ 并发编程之锁的艺术:std::lock-guard与std::unique-lock深度解析

本文深入探讨 C++ 标准库中用于并发编程的两个重要锁类 ——std::lock_guard和std::unique_lock。首先介绍多线程并发编程中资源竞争与同步的背景知识,阐述互斥锁在保护共享资源方面的重要性。详细讲解std::lock_guard和std::unique_lock的功能特性、构造与析构机制、锁的获取与释放方式以及它们在灵活性、性能和适用场景等方面的关键区别。通过丰富的代码示例展示如何在实际多线程程序中正确使用这两个锁类,包括简单的资源保护场景、函数参数传递以及与条件变量结合使用的复杂同步场景等,帮助读者深入理解并熟练掌握这两个锁类的应用,提升 C++ 并发编程的技能与水平。

2401_85760095

C++基于消息队列的多线程实现示例代码

前言 实现消息队列的关键因素是考量不同线程访问消息队列的同步问题。本实现涉及到几个知识点 std::lock_guard 介绍 std::lock_gurad 是 C++11 中定义的模板类。定义如下: template <class> class lock_guard; lock_guard 对象通常用于管理某个锁(Lock)对象,因此与 Mutex RAII 相关,方便线程对互斥量上锁,即在某个 lock_guard 对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 lock_guard 的生命周期结束之后,它所管理的锁对象会被解锁(注:类似 shared_pt

weixin_38503483

C++锁机制对比[项目源码]

本文详细介绍了C++中两种互斥锁RAII封装工具std::lock_guard和std::unique_lock的区别与使用场景。std::lock_guard是一种轻量级锁,基于std::mutex实现,不支持手动解锁,适用于简单的互斥保护场景。而std::unique_lock则更为灵活,支持手动解锁、锁超时、条件变量等高级功能,但开销较大。文章通过多个代码示例展示了二者的具体使用方法,包括如何用std::lock_guard加锁、用std::unique_lock加锁并手动释放锁,以及如何使用{}控制std::lock_guard的生命周期。这些示例清晰地展示了在不同场景下如何选择合适的锁机制来保证线程安全。

zero1
评论 3
收藏 已收藏
分享
返回顶部
slwj
C++ 语言 65,214 成员 250,514 内容