C++11中条件标量和互斥锁应用出现死锁思考

条件变量和互斥锁在多线程同步过程中经常被使用,以下测试程序测试其使用。

目录

1.测试程序1

2.测试程序2 

 3.运行结果思考


1.测试程序1

#include <mutex>
#include <deque>
#include <iostream>
#include <thread>
#include <condition_variable>class MCTest {
public:MCTest() : m_work(true), m_max_num(30), m_next_index(0) {}void producer_thread() {while (m_work) {std::this_thread::sleep_for(std::chrono::milliseconds(500));std::unique_lock<std::mutex> lk(m_cvMutex);m_cv.wait(lk);m_data.push_back(m_next_index++);std::cout << "producer " << m_next_index << ", queue size: " << m_data.size() << std::endl;m_cv.notify_all();}}void consumer_thread() {while (m_work) {std::unique_lock<std::mutex> lk(m_cvMutex);m_cv.wait(lk);int data = m_data.front();m_data.pop_front();std::cout << "consumer " << data << ", deque size: " << m_data.size() << std::endl;m_cv.notify_all();}}
private:bool m_work;std::mutex m_cvMutex;std::condition_variable m_cv;std::deque<int> m_data;size_t m_max_num;int m_next_index;
};int main() {MCTest obj;std::thread tp = std::thread(&MCTest::producer_thread, &obj);std::thread tc = std::thread(&MCTest::consumer_thread, &obj);tp.join();tc.join();return 0;
}

运行结果:

2.测试程序2 

#include <mutex>
#include <deque>
#include <iostream>
#include <thread>
#include <condition_variable>class MCTest {
public:MCTest() : m_work(true), m_max_num(30), m_next_index(0) {}void producer_thread() {while (m_work) {std::this_thread::sleep_for(std::chrono::milliseconds(500));std::unique_lock<std::mutex> lk(m_cvMutex);m_cv.wait(lk, [this]() -> bool { return this->m_data.size() < this->m_max_num; });m_data.push_back(m_next_index++);std::cout << "producer " << m_next_index << ", queue size: " << m_data.size() << std::endl;m_cv.notify_all();}}void consumer_thread() {while (m_work) {std::unique_lock<std::mutex> lk(m_cvMutex);m_cv.wait(lk, [this] { return !this->m_data.empty(); });int data = m_data.front();m_data.pop_front();std::cout << "consumer " << data << ", deque size: " << m_data.size() << std::endl;m_cv.notify_all();}}
private:bool m_work;std::mutex m_cvMutex;std::condition_variable m_cv;std::deque<int> m_data;size_t m_max_num;int m_next_index;
};int main() {MCTest obj;std::thread tp = std::thread(&MCTest::producer_thread, &obj);std::thread tc = std::thread(&MCTest::consumer_thread, &obj);tp.join();tc.join();return 0;
}

运行结果:

 3.运行结果思考

为什么测试1程序没有任何输出,出现死锁,而程序2正常交替执行?

程序1条件变量在得到通知之前会一直wait,如果线程1获取了锁后,阻塞于wait调用,释放了互斥锁,等待通知。此时线程2执行,线程2获取锁后,阻塞于阻塞于wait调用,并释放互斥锁,等待唤醒。本质上是处于死锁状态。

程序2条件变量处于wait阻塞时,除了得到通知会解除阻塞外,第二个参数为true时,wait函数也会返回,所以避免了死锁的存在。

总结一下,wait函数参数2含义如下:

(1)如果参数为true,即使没有收到通知,wait也会返回,此时本线程互斥量已经加锁
(2)如果参数为false,在没有收到通知时,解锁互斥量wait一直阻塞
(3)如果没有参数,与false一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/255222.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

一键搭建本地Wordpress环境 - MacOS

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

C++ 拷贝替换算法

&#x1f914;拷贝替换算法&#xff1a; &#x1f642;1.copy 拷贝 在 C STL 中&#xff0c;copy()是一种常用的算法&#xff0c;用于将一个指定范围内的元素复制到目标位置中&#xff0c;不会改变原有序列的大小。 copy()的函数原型为&#xff1a; template<class Inp…

.NET 8 Preview 4 发布

作者&#xff1a;Jon Douglas - Principal Program Manager, NuGet 翻译&#xff1a;Alan Wang 排版&#xff1a;Alan Wang 我们很高兴与大家分享在 .NET 8 预览版 4 中的所有新功能和改进&#xff01;这次发布是继预览版 3之后的更新。您将在这些月度发布中看到更多功能逐渐亮…

如何将过大的图片缩小直至能够在一张A4纸上打印出来

问题描述 本人需要打印一张腾讯会议参会人员列表截图&#xff08;.png&#xff09;以用于报销&#xff0c;但是人员列表截图过大如果直接打印在A4纸上会有缺失&#xff0c;需要缩小后再打印 解决方案 右击图片文件用”画图“打开&#xff1a; 点击左上角”打印预览“&#x…

打印缩放怎么设置,去哪里打印可以调整打印格式

很多打印的店铺大多数打印资料&#xff0c;都是根据打印者发来的资料进行打印的&#xff0c;如果想要缩印的话需要打印者提前调整好格式后进行打印&#xff0c;但是很多人不知道怎么将打印的资料进行缩小&#xff0c;去哪里打印可以调整打印格式呢&#xff1f; 对于经常备考的…

PDF表格文档打印时缩放与居中解决方案

网上下载的pdf表格文档有时是被缩小且不居中的&#xff0c;打印的时候要填充整个页面&#xff0c;具体操作步骤如下&#xff1a; 一&#xff1a;首先安装PDF阅读软件&#xff0c;比如我安装的是Acrobat Reader DC 然后打开PDF表格文档&#xff0c;这是原文件。 二、如图所示&a…

3D打印gcode命令大全及解析

*G0&#xff1a;快速移动 *G1&#xff1a;控制移动 坐标轴XYZE移动控制&#xff08;G0和G1一样&#xff09; 例子&#xff1a;G0 F2000 X30 Y30 Z30 E3 *G2&#xff1a;顺时针画弧 *G3&#xff1a;逆时针画弧 此命令有两种形式&#xff1a;IJ-form和R-form。I指定了X偏移…

使用C#更改打印机驱动打印属性设置

更多源码参考&#xff0c;可参考本人csdn下载空间(http://download.csdn.net/detail/kingmax54212008/9881707)。或联系本人&#xff1a;kingmax5421gmail.com 介绍 为应用程序打印MS Word文档&#xff0c;并且应该给用户一个选项来更改他/她想要打印的文档的打印机设置&#x…

A4纸张缩印怎么只打印一半A4纸的内容

A4纸张的规格:210mmx297mm&#xff08;参考文章2&#xff09; 21cmx29.7cm A4纸张一半的长度 差不多 是 15cm&#xff0c;如下图所示&#xff0c;设置 页边距。打印即可 参考文章&#xff1a; 1. world文档怎么缩印&#xff08;如何打小抄&#xff09; 2.A4纸 3. 4.

计算机图桌面打印出来,电脑excel图片无法打印怎么处理

电脑excel图片无法打印怎么处理 excel是我们常用的数据编辑工具但是当我们需要打印的时候有可能出现图片无法打印的情况继续编就教大家怎么处理 具体如下: 1. 首先我们在桌面上找到需要进行处理的excel图标点击打开 2. 进入到表格界面之后我们点击表格最上方的打印预览图标然后…

关于windows XP下北洋BTP-2200E打印设置问题

&#xff08;1&#xff09;操作使用手册&#xff1a;http://www.chongshang.com.cn/manual/m_BTP2200E.shtml &#xff08;2&#xff09;驱动安装&#xff1a;http://www.chongshang.com.cn/news/view.asp?id397 &#xff08;3&#xff09;纸张设置&#xff1a; 1.打印机属性…

PPT缩印指南

PPT的讲义打印模式&#xff0c;虽然能把几张PPT打印在1页。但其实是个中看不中用的功能&#xff0c;因为各个页面间的间隔是无法消除的。为此还纠结了很长时间。 其实甩开打印讲义的功能&#xff0c;用普通的缩印方式就可以实现无间隔的缩印输出。 据说有个fineprint的软件可…

UNIX网络编程卷一 学习笔记 第十七章 ioctl操作

ioctl函数传统上一直作为那些不适合归入现有已定义类别的特性的系统接口。POSIX正在通过创建特定的包装函数来代替ioctl函数的某些功能&#xff0c;以取而代之的是那些已被POSIX标准化的函数。例如&#xff0c;Unix终端接口传统上使用ioctl函数访问&#xff0c;而POSIX为终端创…

wps,word缩印怎么设置

目录 wps&#xff0c;word缩印怎么设置 宋体 字号5&#xff08;注意&#xff1a;非五号字&#xff09;字体缩放80&#xff05;&#xff0c;字体间距-2 分为4栏 wps&#xff0c;word缩印怎么设置 宋体 字号5&#xff08;注意&#xff1a;非五号字&#xff09;字体缩放80&am…

缩印技巧你知多少?缩印怎么设置?

当打印word文档或者Excel表格时&#xff0c;如果花费很多时间去编辑格式&#xff0c;又或者需要把内容尽可能花最少的纸张页数打印出来&#xff0c;那么&#xff0c;有什么办法可以快速打印出来呢&#xff1f;缩印就可以帮到忙&#xff0c;缩印怎么设置&#xff1f;小编整理了w…

手机常识汇总

目录 一、手机历史介绍 第一代模拟制式手机(1G) 什么是模拟网? 模拟网络与数字网络的区别 数字通信与模拟通信相比具有明显的优点: 第二代数字手机(2G) 什么是“GSM” 什么是 “CDMA”? GSM 数字机和模拟手机话音相比 什么是“GSM/CDMA 双模机”? 什么是“TDMA”…

chatgpt赋能python:Python中的绝对值函数

Python中的绝对值函数 在Python编程语言中&#xff0c;绝对值函数是一个非常重要和常用的函数。它可以帮助我们快速地计算一个数的绝对值&#xff0c;而不需要手动使用if语句来处理。在本文中&#xff0c;我们将介绍Python中的绝对值函数&#xff0c;并且讨论它的一些应用。 …

微信H5页面点击直接跳转app-微信开放标签

开发微信H5项目时&#xff0c;需要从h5直接跳转至app&#xff0c;绞尽脑汁调研一番后&#xff0c;发现微信开放标签能实现&#xff0c;but 环境配置和测试流程真的很复杂&#xff0c;真的配置四小时&#xff0c;开发仅需30分钟&#xff0c;经过不断踩坑终于上线&#xff0c;踩过…

微信浏览器跳转app解决方案

微信浏览器跳转app解决方案 新版本微信浏览器中&#xff0c;已禁用打开其他APP应用&#xff0c;只支持打开微信合作商 APP应用&#xff0c;所以无法通过微信浏览器直接唤醒其他APP应用。列举微信浏览器唤醒APP的2种解决方案&#xff1a; 方案一&#xff1a;通过Url 跳转到H5…

uniapp 微信授权,微信分享,微信支付,微信跳转app集成

更新提示 &#xff01;&#xff01;&#xff01;&#xff01; 更新提示 &#xff01;&#xff01;&#xff01;&#xff01; 更新提示 &#xff01;&#xff01;&#xff01;&#xff01; 在7.12号微信推出不能强制获取用户信息才能使用。再授权之前得明确告知用户。经过我的…