子线程问题代码案例分析&引申思考

这些关于 Handler 的知识点你都知道吗? 在安卓面试中,关于 Handler 的问题是必备的,但是这些关于 Handler 的知识点你都知道吗? 一、题目层次 Handler 的基本原理 子线程中怎么使用 Handler MessageQueue 获取消息是怎么等待 为什么不用 wait 而用 epoll 呢? 线程和 Handler Looper MessageQueue 的关系 多个线程给 MessageQueue 发消息,如何保证线程安全 Handler 消息延迟是怎么处理的 View.post 和 Handler.post 的区别 Han 阅读详情
  • 错误案例1

  • 错误案例2

int CDownloadPlugin::FirstProcessEvent(void* pEvent, void* target)
{
	***
	std::unique_lock <std::mutex> lck(g_lock);
	{
		***
	}
		
	repo_empty.notify_all();
    ***
}

DWORD WINAPI TestProc(LPVOID lpThreadParameter)
{
    ***
	std::unique_lock <std::mutex> lck(g_lock);
	while (g_queIEvent.empty())
	{
		repo_empty.wait(lck);
		***
	}
    ***
}
void CDownloadPlugin::run()
{
	***
	while (!this->isInterrupted()) {
		m_Semaphore.Wait();
        ***		
		{
			std::lock_guard<std::mutex> lk(m_mutex_filelist);
			***
		}
	}
}


void CDownloadPlugin::UnInit()
{
	//停止并等待线程结束
	if (!this->isInterrupted())
	{
		this->interrupt();
	}

	CXdThread::join();
}

 问题分析:

代码块-1:

问题代码:while (g_queIEvent.empty()), 注意此循环条件指的是线程终止条件(while循环跳出或者第一次没有进去表明此线程结束)

解决方法:①改为while (!this->isInterrupted()) ②改为while (!m_bStop) 要注意其他地方也要对应处理

代码块-2:

产生现象:进程停止卡死(因为子线程没有被正常停止,子线程正在等待互斥量释放——>>>变相的死锁问题)
问题代码:
    //停止并等待线程结束
	if (!this->isInterrupted())
	{
		this->interrupt();
	}
解决方法:
    this->interrupt();下一条语句加m_Semaphore.Signal(); 意思是在主线程停止的时候,设置完子线程终止标志,必须要额外通知子线程,否则子线程会死等信号状态。
  • 修正方案

void CDownloadPlugin::run()
{
	while (!m_bStop)
	{		
		m_Semaphore.Wait();

		{
			std::lock_guard<std::mutex> lk(m_mutex_filelist);
			if (XXX.empty())  // XXX代表消费的队列
			{
				continue;
			}
        }
    ***

}

int CDownloadPlugin::FirstProcessEvent(void* pEvent, void* target)
{
	{
		std::lock_guard<std::mutex> lk(m_mutex_filelist);
		***
	}
	m_Semaphore.Signal();
}

void CDownloadPlugin::UnInit()
{
	if (!m_bStop)
	{
		m_bStop = true;
		m_Semaphore.Signal();

		if (!CXdThread::isInterrupted())
		{
			CXdThread::interrupt();
		}

		CXdThread::join();
	}
}
  • 引申思考

总结:多线程程序需要关注的最核心的两个点:①线程退出标志②线程同步、互斥对象使用的代码位置一定要配合必要的辅助逻辑。 即可

光模块的封装工艺有哪些? COB封装传统的单路10Gb/s或25Gb/s速率的光模块采用SFP封装将电芯片和TO封装的光收发组件焊接到PCB板上组成光模块。但对于40G及以上速率的高速光模块,受激光器速率限制(多为25G),主要通过多通道并行实现,如40G由4×10G实现,而100G则由4×25G实现。蝶形封装:壳体通常为长方体,结构及实现功能通常比较复杂,可以内置制冷器、热沉、陶瓷基块、芯片、热敏电阻、背光监控,并且可以支持所有以上部件的键合引线。BOX封装属于蝶形封装的一种,用于多通道并行封装。 阅读详情

相关推荐

BRAM在图像处理缓存中的实现:完整示例解析

深入讲解如何利用BRAM高效实现图像处理中的数据缓存,结合实际案例解析BRAM的应用优势与设计细节,提升系统性能。

weixin_29443363的博客 332

java为什么开子线程_java线程启动原理分析

一、前言不知道哪位古人说:人生三大境界。第一境界是:看山是山看水是水;第二境界是看山不是山看水不是水;第三境界:看山还是山看水还是水。其实我想对于任何一门技术的学习都是这样。形而上下者为之器,形而上者为之道。一直很喜欢自己大一的高数老师,老师是老教授了,他讲数学,会引申到建筑学,计算机科学,以及哲学再到生活中的常识。也能从其他学科、日常生活中,提取出数学的概念。我想,这就是形而上者了。不胜望之不多...

weixin_42116681的博客 254

Python量化投资入门教程:从零构建你的第一个交易策略

量化投资教程以数学模型和计算机程序实现超额收益,选用Python工具链完成数据获取、策略构建及回测。通过移动平均线交叉策略示例,展示数据预处理、信号生成、收益计算及可视化全流程,结合收益率、最大回撤和夏普比率评估策略,并建议参数优化与策略融合提升稳健性。

ylmx5201314的博客 2453

【Android面试查漏补缺】之Handler详解,带你全面理解Handler消息机制

在安卓面试中,关于 Handler 的问题是必备的,但是这些关于 Handler 的知识点你都知道吗? 一、题目层次 Handler 的基本原理 子线程中怎么使用 Handler MessageQueue 获取消息是怎么等待 为什么不用 wait 而用 epoll 呢? 线程和 Handler Looper MessageQueue 的关系 多个线程给 MessageQueue 发消息,如何保证线程安全 Handler 消息延迟是怎么处理的 View.post 和 Handler.post 的区别 Ha.

zhireshini233的博客 256

1、Ovirt 开源虚拟化平台安装

Ovirt虚拟化Node和Engine安装

大鱼 6266

C#调用企业微信JS-Sdk实现扫描二维码

企业微信JS-SDK是企业微信面向网页开发者提供的基于企业微信内的网页开发工具包。通过使用企业微信JS-SDK,网页开发者可借助企业微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用企业微信分享、扫一扫等企业微信特有的能力,为企业微信用户提供更优质的网页体验提示:生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是H5应用调用企业微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。

清浅 937

面试官带你学Android——面试中Handler 这些必备知识点你都知道吗?

在Android面试中,关于 Handler 的问题是必备的,但是这些关于 Handler 的知识点你都知道吗? 一、题目层次 Handler 的基本原理 子线程中怎么使用 Handler MessageQueue 获取消息是怎么等待 为什么不用 wait 而用 epoll 呢? 线程和 Handler Looper MessageQueue 的关系 多个线程给 MessageQueue 发消息,如何保证线程安全 Handler 消息延迟是怎么处理的 View.post 和 Handl..

weixin_44339238的博客 369

【QT开发教程】使用Qt进行NFC编程

近场通信(NFC,Near Field Communication)技术广泛应用于现代设备中,例如智能手机、支付终端和门禁系统。Qt提供了一套完整的NFC模块,使开发者可以轻松地在应用程序中实现NFC功能。本文将介绍如何在Qt中进行NFC编程,包括基本概念、使用方法以及一些实际的示例。

科技改变人类,技术成就未来 1465

Handler 这些知识点你都知道吗?

在安卓面试中,关于 Handler 的问题是必备的,但是这些关于 Handler 的知识点你都知道吗? 一、题目层次 Handler 的基本原理 子线程中怎么使用 Handler MessageQueue 获取消息是怎么等待 为什么不用 wait 而用 epoll 呢? 线程和 Handler Looper MessageQueue 的关系 多个线程给 MessageQueue 发消息,如何保证线程安全 Handler 消息延迟是怎么处理的 View.post 和 Handler.post 的区别 Han

A_pyf的博客 300

手把手教你学veriolg(二十六)-- Verilog CIC 滤波器设计

目录 Verilog CIC 滤波器设计1. CIC 滤波器的基本原理2. Verilog 实现3. 说明4. 测试激励5. 总结 CIC(Cascade-Integrator-Comb)滤波器是一种特殊的数字滤波器,常用于多速率信号处理中,尤其是用于信号的上采样(插值)和下采样(抽取)。CIC 滤波器的特点在于它具有简单的硬件实现、不需要乘法器(仅使用加法器和延迟元件)、且具有线性相位特性。然而,CIC 滤波器的缺点是它会产生较大的量化误差,因此在设计时需要特别注意字长的选择以避免溢出。1. CIC 滤波

MHD0815的博客 888

stable diffusioncontrolNet 预处理器/模型的下载及安装使用教程

首先说明,controlNet 的模型 不同于stable diffusion 模型,这一点一定要区分清楚。下面提供多个ControlNet 预处理器+ 专用模型的百度网盘下载链接,都是由群友整理贡献,但各自包含的版本不同,大家可自行选择。推荐下载紫色链接内的模型,fp16版文件更小,稍微新一些的controlnet插件还添加了对control-lora的支持(注意,要求controlnet插件的版本比12月16号新(1.1.423以上)才能正常识别),推荐下载;

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3384

Handler 10问

概述 在安卓面试中,关于 Handler 的问题是必备的,但是这些关于 Handler 的知识点你都知道吗? 题目层次 Handler 的基本原理 子线程中怎么使用 Handler MessageQueue 获取消息是怎么等待 为什么不用 wait 而用 epoll 呢? 线程和 Handler Looper MessageQueue 的关系 多个线程给 MessageQueue 发消息,如何保证线程安全 Handler 消息延迟是怎么处

Android 264

笔试题-2023-芯原-数字前端设计or验证【纯净题目版】

笔试题-2023-芯原-数字前端设计or验证【纯净题目版】

w0shishabi的博客 5685

解决:InheritableThreadLocal与线程池共用的问题

InheritableThreadLocal 是 ThreadLocal 的一个子类,它不但继承了ThreadLocal的所有特性,父线程中的 InheritableThreadLocal 变量的值可以被子线程继承。

怪力乌龟的博客 2505

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

全面理解Handler消息机制,搞懂这十个大厂面试真题你就彻底懂了

在安卓面试中,关于 Handler 的问题是必备的,但是这些关于 Handler 的知识点你都知道吗? 一、题目层次 Handler 的基本原理 子线程中怎么使用 Handler MessageQueue 获取消息是怎么等待 为什么不用 wait 而用 epoll 呢? 线程和 Handler Looper MessageQueue 的关系 多个线程给 MessageQueue 发消息,如何保证线程安全 Handler 消息延迟是怎么处理的 View.post 和 Handler.post 的区别 Han

chuhe1989的博客 512

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

java线程启动原理分析

一、前言 不知道哪位古人说:人生三大境界。第一境界是:看山是山看水是水;第二境界是看山不是山看水不是水;第三境界:看山还是山看水还是水。 其实我想对于任何一门技术的学习都是这样。 形而上下者为之器,形而上者为之道。一直很喜欢自己大一的高数老师,老师是老教授了,他讲数学,会引申到建筑学,计算机科学,以及哲学再到生活中的常识。也能从其他学科、日常生活中,提取出数学的概念。我想,这就是形而上者了。 不...

qq_36860032的博客 296

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java线程启动_java线程启动原理分析

一、前言不知道哪位古人说:人生三大境界。第一境界是:看山是山看水是水;第二境界是看山不是山看水不是水;第三境界:看山还是山看水还是水。其实我想对于任何一门技术的学习都是这样。形而上下者为之器,形而上者为之道。一直很喜欢自己大一的高数老师,老师是老教授了,他讲数学,会引申到建筑学,计算机科学,以及哲学再到生活中的常识。也能从其他学科、日常生活中,提取出数学的概念。我想,这就是形而上者了。不胜望之不多...

weixin_39958019的博客 79

面试官带你学安卓 - Handler 这些知识点你都知道吗 | 掘金技术征文-双节特别篇...

在安卓面试中,关于 Handler 的问题是必备的,但是这些关于 Handler 的知识点你都知道吗? 一、题目层次 Handler 的基本原理 子线程中怎么使用 Handler MessageQueue 获取消息是怎么等待 为什么不用 wait 而用 epoll 呢? 线程和 Handler Looper MessageQueue 的关系 多个线程给 MessageQueue 发消息...

cpongo881 113

iOS 性能优化之图片加载和处理

前言 本文基于WWDC2018-Image and Graphics Best Practices,对图片加载和处理的思考和总结。 本文不是WWDC翻译,如果需要了解视频内容可以点击上面的链接观看。 正文 图片的显示分为三步:加载、解码、渲染。 通常,我们操作的只有加载,解码和渲染是由UIKit进行。 什么是解码? 以UIImageView为例。当其显示在屏幕上时,需要UIImage作为数据源。...

H.A.N的博客 1843

android自学教程!BAT等大厂必问技术面试题,BAT大厂面试总结

本专栏专注分享大型Bat面试知识,后续会持续更新,喜欢的话麻烦点击一个关注 面试官: ButterKnife为什么执行效率为什么比其他注入框架高?它的原理是什么 心理分析: ButterKnife框架一直都是使用,很少又开发者对butterknife深入研究的,既然你是面试Android高级岗位,自然需要有相应被问到原理的准备,面试官想问你对注解处理器了解多少,Android编译流程有多少认识 **求职者:**应该从 注解处理器原理 与优势说起,肯定注解处理器对解放生产力的作用。然后可以引申常见的 But

Sunbuyi的博客 157

BAT等大厂必问技术面试题,BAT大厂面试总结

本专栏专注分享大型Bat面试知识,后续会持续更新,喜欢的话麻烦点击一个关注 面试官: ButterKnife为什么执行效率为什么比其他注入框架高?它的原理是什么 心理分析: ButterKnife框架一直都是使用,很少又开发者对butterknife深入研究的,既然你是面试Android高级岗位,自然需要有相应被问到原理的准备,面试官想问你对注解处理器了解多少,Android编译流程有多少认识 **求职者:**应该从 注解处理器原理 与优势说起,肯定注解处理器对解放生产力的作用。然后可以引申常见的 But

m0_57286518的博客 141

ios 从assets加载图片_iOS 图片加载和处理

一、图片显示图片的显示分为三步:加载、解码、渲染。解码和渲染是由 UIKit 进行,通常我们操作的只有加载。以 UIImageView 为例。当其显示在屏幕上时,需要 UIImage 作为数据源。UIImage 持有的数据是未解码的压缩数据,能节省较多的内存和加快存储。当 UIImage 被赋值给 UIImage 时(例如 imageView.image = image;),图像数据会被解码,变成...

weixin_30495795的博客 1296

字节后端四面,终于拿offer,鬼知道我经历了啥

今天群里有几位群友在聊入职的事情,其中一位群友说前几天面上了字节,我便询问了一下具体内容,经过同意也可以分享给大家啦。 并且文章中所有面试题和答案小编都为大家整理了:戳这里免费领取,暗号:优快云,还有更多大厂面试专题资料哦 字节是面试持续时间最久的了 ????从内推,到笔试,到一面(简历,笔试都太菜了????估计是最后面的那一批)。 (一面)1h左右 1.项目详情,后面基本都是从项目中提问的 2.glide原理 3.图片压缩,图片大小 4.三级缓存,LruCache和...

qq_43080036的博客 3696

Android初中级面筋,跟着这几步去准备,大厂也不远了

由于面经的篇幅过长,需要完整面经的可以扫描下方二维码免费领取!!!目录第一章 Java方面Java基础部分Java集合Java多线程Java虚拟机第二章 Android方面Android四大组件相关Android异步任务和消息机制Android UI绘制相关Android性能调优相关Android中的IPCAndroid系统SDK相关第三方框架分析综合技术数据结构方面设计模式计算机网络方面Kotlin方面第三章 音视频开发高频面试题。

Android23333的博客 193
上一篇: 关于回调函数跟this指针的一些理解
下一篇: git-biz服务器迁移引发的ssh访问服务器失败问题解决(http正常)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

ปรัชญา แค้วคำมูล

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

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

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

打赏作者

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

抵扣说明:

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

余额充值