首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Boost条件变量的死锁;线程之间不更新的指针?

使用Boost条件变量的死锁;线程之间不更新的指针?
EN

Stack Overflow用户
提问于 2014-10-17 18:00:44
回答 3查看 315关注 0票数 0

我正在实现一个使用IO管道的应用程序。我有三个线程,一个读取数据(图像),一个对它们进行处理,另一个将处理后的图像写回磁盘。

我遇到了读取器线程和处理线程的死锁。线程都可以访问一个名为toDeblur的指针,该指针指向下一个要处理的图像。读取器线程读取图像,将其指针分配给toDeblur,然后通知处理线程toDeblur包含用于处理的图像。

读取器线程的相关代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Wait until it's okay to read again.
boost::unique_lock<boost::mutex> lock(*deblurLock);
while(toDeblur != NULL)
{
    readCondition->wait(lock);
}

DeblurImage* read = readImage(is, fileName);

toDeblur = read;

cerr << "readImage notifying deblurCondition" << endl;
//Notify the processing thread(s) that an image is ready.
deblurCondition->notify_one();

以及处理线程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Wait for our condition variable.
boost::unique_lock<boost::mutex> lock(*deblurLock);
cerr << "processImage waiting for non-NULL image" << endl;
while(toDeblur == NULL)
{
    cerr << "processImage waiting for deblurCondition variable" << endl;
    deblurCondition->wait(lock);
}

readCondition->notify_one();
processImage(kernels, deblurP, toDeblur);

但是,我发现在运行这段代码时,我遇到了一个死锁,因为当被通知时,处理线程检查toDeblur是否为NULL,发现它是空的,然后回到睡眠状态,但是读取器线程在将一个有效的图像分配给toDeblur之后通知它。

我错过什么明显的东西了吗?我能做些什么来确保处理线程看到toDeblur的更新吗?

编辑:我应该补充一点,上面的片段是循环的一部分,所以锁/等待在每一轮读取/处理之前发生。

运行该程序的输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
processImage waiting for non-NULL image
processImage waiting for deblurCondition variable
readImage is starting a read
readImage notifying deblurCondition
processImage waiting for deblurCondition variable

因此,processImage在收到通知后醒来,但看到toDeblur仍然为NULL,并返回等待。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-18 21:20:24

我已经解决了问题。死锁的原因是,toDeblur指针是通过值而不是引用传递给线程的,这当然意味着当读取器线程更新指针的值(而不是它所指向的对象)时,该更新没有反映在处理线程所拥有的指针的副本中。

票数 0
EN

Stack Overflow用户

发布于 2014-10-18 00:20:14

为什么不将“deblur”图像指针与生产者-消费者队列排队呢?您可以使用*deblur的固定池(在启动时创建并保存在池队列中)来控制它。

如果处理有多个线程,则可能需要图像中的序列号,以确保输出不会出错。

票数 1
EN

Stack Overflow用户

发布于 2014-10-17 18:39:25

您有两个条件变量共享一个锁/互斥,最好将每个条件变量与一个独立的锁/互斥体一起使用。顺便说一句,一个条件变量的典型用法是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// wait    
while(...){
        boost::unique_lock<boost::mutex> lock(aMutex);
        condVar->wait(lock);
}

// notify
{
        boost::unique_lock<boost::mutex> lock(aMutex);
        condVar->notify_one();
}

请确保在调用等待/通知后立即释放锁,否则,很有可能导致死锁。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26435602

复制
相关文章
EasyCVR开启音频后,视频调阅播放默认为静音的问题优化
EasyCVR基于云边端一体化架构,部署轻快、功能灵活,平台可支持多协议、多类型设备接入,包括:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等(具体见下图)。在视频能力上,可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群、智能分析以及平台级联等。
TSINGSEE青犀视频
2023/05/26
4090
如何将视频轻松转换为 GIF
有时看到一条有意思的视频想发到朋友圈,但朋友圈有限制时长,而且也不方便,这时可以把视频转GIF(再做成表情包也可以),再发到朋友圈或者微博(不用像视频一样需要等待审核)。
苏生不惑
2020/02/26
1.8K0
1342: [Baltic2007]Sound静音问题
1342: [Baltic2007]Sound静音问题 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 710  Solved: 307 [Submit][Status][Discuss] Description 静音问题 数字录音中,声音是用表示空气压力的数字序列描述的,序列中的每个值称为一个采样,每个采样之间间隔一定的时间。 很多声音处理任务都需要将录到的声音分成由静音隔开的几段非静音段。为了避免分成过多或者过少的非静音段,静音通常是这样定义的:m个采样的
HansBug
2018/04/10
8590
高清视频编码格式_如何将高清视频转化为蓝光
高清视频编码最常用的编码格式是MPEG2-TS、MPEG4、H.264和VC-1这四种算法。  
全栈程序员站长
2022/11/10
1.6K0
2019-12-1-微信小程序视频流静音后画面卡死问题研究
在静音期间试着使用ffplay进行播放,流能够正常播放,所以不存在推流端视频流丢帧的问题
黄腾霄
2020/06/10
8750
EasyPlayer如何将视频快照嵌入demo里?
TSINGSEE青犀视频EasyPlayer播放器系列属于非常开放的播放器项目,针对不同的协议衍生出了多个版本,如EasyPlayer.js、EasyPlayerPro等,而且用户还可以根据自己的需求,将其集成进流媒体平台,支持轻松调用接口或自主进行二次开发,实用性、稳定性都非常强。
TSINGSEE青犀视频
2022/01/25
5460
如何在远程会议的时候静音吃薯片?微软团队用AI去除视频噪声
上个月,Microsoft宣布,其与Slack,Facebook Workplace以及Google的Hangouts Chat的竞争对手Teams的每日活跃用户已超过4400万。这一里程碑却掩盖了其“稍后”发布的一些新功能。大部分功能都很简单明了:举手功能表明你有话要说;离线和低带宽支持,即使在网络连接不畅或没有网络情况下,也能阅读聊天消息并回复;以及将聊天弹出到一个单独窗口。其中还有一项实时噪声抑制功能吸引了大家眼球 - Microsoft演示AI如何在通话过程中减少让人分心的背景噪声。
大数据文摘
2020/04/28
1.2K0
如何在远程会议的时候静音吃薯片?微软团队用AI去除视频噪声
Instagram如何将视频编码时长缩短94%?
 点击上方“LiveVideoStack”关注我们 ▲扫描图中二维码或点击阅读原文▲ 了解音视频技术大会更多信息 编者按 Editor's note 眼看用户视频的增长将超过服务器的算力上限,既没有额外的服务器来支持,也不能对用户体验造成大的冲击,Instagram的工程师找到了两种编码过程中重复计算的部分,并将他们合二为一,如此便可节省可观的算力。他们是如何做到的呢? 作者:Ryan Peterman, Haixia Shi 译者:核子可乐 审校:Haixia Shi 在对效率的不断追求当中,Inst
LiveVideoStack
2023/04/04
9910
Instagram如何将视频编码时长缩短94%?
ubuntu 系统声音静音问题
在硬件设备中发现了系统声音重启被静音的问题,导致设备声音不可用。Bug情况暂未复现。无法从根本解决问题。只能想一个临时的问题。记录一下,临时的解决方案。主要还是通过 gnome-control-center 、pactl、amixer来解决。
何其不顾四月天
2023/03/10
2K0
【Android FFMPEG 开发】FFMPEG 初始化 ( 网络初始化 | 打开音视频 | 查找音视频流 )
FFMPEG 初始化流程 : FFMPEG 执行任何操作前 , 都需要初始化一些环境 , 及相关数据参数 ;
韩曙亮
2023/03/27
7300
TSINGSEE青犀视频智能视频监控EasyCVR如何将实时监控视频流分享出去?
开源EasyDarwin视频监控平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视频定时轮播。
TSINGSEE青犀视频
2023/08/02
2190
如何将数组的所有成员初始化为相同的值
C++ algorithm 有两个函数 – fill 和 fill_n,可以给数组赋值,
ClearSeve
2022/02/11
2.7K0
机器人如何将医疗带入未来(视频)
作者|Jennifer Levine 选文|孙强 编译|孙强 丁一 汪霞 让我们来谈谈机器人。我这儿说的并不是机器人接管世界、杀死人类的那种,而是正在帮助我们,将我们的生活变得更美好的那
大数据文摘
2018/05/21
6070
如何将录制的DOM转成视频文件
Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~ 背景说明: &ensp;&ensp;&ensp;&ensp; 最近有在看GitHub上的rrweb项目,确实是一款DOM录制的神器,在使用文档中提供了很多我们会用到的场景和对应的示例,我们今天来看一下其中一个场景《转换为视频》,虽然rrweb直接回放的效果最佳但还是会遇到需要转为视频进行存储的要求,通过查看rrweb提供的rrvideo项目后决定写一下整个转换的过程,大致的流程图如下: 环境配置: 安
前端小鑫同学
2022/12/26
1.6K0
如何将录制的DOM转成视频文件
iOS如何判断设备处于静音模式
-(BOOL)silenced { #if TARGET_IPHONE_SIMULATOR // return NO in simulator. Code causes crashes for some reason. return NO; #endif CFStringRef state; UInt32 propertySize = sizeof(CFStringRef); AudioSessionInitialize(NULL, NULL, NULL, NULL); Aud
好派笔记
2021/10/29
1.6K0
视频流媒体服务器如何将视频直播转推到其他平台?
每一个行业做久了,都会有些小小的私心,就是把这个东西完善到更好,甚至到创造一个新东西的地步,我做视频行业也是这样的(我相信一定不是我一个人这么想的),所以如果有开发者提出什么需求,哪怕是目前不能满足的,我也会尽量满足。不过好在目前我们产品的功能已经趋于完善。
EasyNVR
2020/05/20
2.4K0
从 Android 静音看正确的查找 bug 的姿势
0、写在前面 没抢到小马哥的红包,无心回家了,回公司写篇文章安慰下自己TT。。话说年关难过,bug 多多,时间久了难免头昏脑热,不辨朝暮,难识乾坤。。。艾玛,扯远了,话说谁没踩过坑,可视大家都是如何从坑里爬出来的呢? 1、实现个静音的功能 话说,有那么一天, PM:『我这里有个需求,很简单很简单那种』 RD:『哦,需要做三天』 PM:『真的很简单很简单那种』 RD:『哦,现在需要做六天了』 对呀,静音功能多简单,点一下,欸,静音了;再点一下,欸,不静音了;再点一下,欸。。。 我一看 API,是挺简单的: p
腾讯Bugly
2018/03/23
1.1K0
【Android】自制静音App,解决他人手机外放问题
看到一个粉丝留言,吐槽舍友深夜手机外放,打扰别人休息,想设计一款软件阻止舍友行径。于是我就来简单设计一下。
zstar
2022/11/02
1.4K0
【Android】自制静音App,解决他人手机外放问题
音频缺失录制分析
RTMP Reader和Muxing各自包含音视频的AVCodecContext,共四个AVCodecContext
onexie
2020/01/20
1.4K0
点击加载更多

相似问题

CodeContracts问题

30

CodeContracts -误报

40

MissingFieldException与CodeContracts

13

理解TransactionScopeOptions: RequiresNew =禁止+必需?

10

特定通用接口的CodeContracts

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文