工作日志(祝勇)10.22

多线程并发处理实战与原理详解 多线程并发处理是现代高性能软件系统的核心机制之一,它允许多个执行流在同一进程中并行运行,从而显著提升程序的响应速度与吞吐能力。本章将从并发处理的基本概念入手,深入剖析线程与进程的本质区别,探讨多线程的执行模型及其生命周期管理机制。通过对比不同编程语言对线程的封装方式,我们将理解多线程在高并发、实时响应等复杂场景中的优势与潜在挑战,为后续深入掌握线程调度、任务队列及线程池等关键技术打下坚实基础。 阅读详情
 
任务:实现三路视频的任意回放
要求:使用线程控制回放,回放方式可选择
2006年10月22日星期日
问题:在两路或三路同时回放同一个文件夹下的BMP图像时,由于两个或三个线程同时访问相同的数据而引发冲突,使线程意外终止。
解决方法:利用MFC提供的同步类和同步访问类。
同步类:CSyncObject, CSemaphore, CMutex, CCriticalSection ,CEvent;
同步类用于当访问资源时保证资源的整体性。其中CsyncObject 是其它四个同步类的基类,不直接使用。信号同步类CSemaphore 通常用于当一个应用程序中同时有多个线程访问一个资源(例如,应用程序允许对同一个Document 有多个View)的情况;事件同步类CEvent 通常用于在应用程序访问资源之前应用程序必须等待(比如,在数据写进一个文件之前数据必须从通信端口得到)的情况;而对于互斥同步类CMutex 和临界区同步类CcriticalSection 都是用于保证一个资源一次只能有一个线程访问,二者的不同之处在于前者允许有多个应用程序使用该资源(例如,该资源在一个DLL 当中)而后者则不允许对同一个资源的访问超出进程的范畴,而且使用临界区的方式效率比较高。
同步访问类:CMultiLock和CSingleLock 。
同步访问类用于获得对这些控制资源的访问。CMultiLock 和CSingleLock 的区别仅在于是需要控制访问多个还是单个资源对象。
本问题可以使用互斥同步类CMutex 、信号量同步类CSemaphore和临界区同步类CcriticalSection 中的任意一个解决。
1、临界区
临界区是保证在某一个时间只有一个线程可以访问数据的方法。使用它的过程中,需要给各个线程提供一个共享的临界区对象,无论哪个线程占有临界区对象,都可以访问受到保护的数据,这时候其它的线程需要等待,直到该线程释放临界区对象为止,临界区被释放后,另外的线程可以强占这个临界区,以便访问共享的数据。当利用临界区同步时,同一时刻每次只有一个线程可以访问受到保护的数据,这样可以保证程序的稳定性。由于当一个线程访问受到保护的数据的时候,其他线程必须等待,所以同步时耗时也较多。
#include "afxmt.h"
CCriticalSection Section;//声明一个临界区同步类对象
当线程需要访问保护数据时,调用临界区对象的Lock()成员函数;当对保护数据的操作完成之后,调用临界区对象的Unlock()成员函数释放对临界区对象的拥有权,以使另一个线程可以夺取临界区对象并访问受保护的数据。
2.互斥
互斥跟临界区很相似,便远比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。通过互斥同步类CMutex来完成线程间的互斥,为了访问一个互斥对象,务必建立一个同步访问类CSingleLock或CMultiLock对象,用于访问控制。使用方法:
#include "afxmt.h"
CMutex m_mutex; //声明一个互斥同步类对象
在线程执行函数中声明同步访问类CSingleLock对象
CSingleLock slock(&m_mutex);
如果互斥没有被线程占用,那么当前的调用线程可以成为互斥的占用者。要实现对互斥的访问,就要调用CSingleLock的成员函数Lock(),如果一个线程占用了互斥,那么系统将挂起当前的调用线程,直到这个互斥被释放为止,这时,被挂起的线程将被唤醒并取得对互斥的控制。释放互斥是通过调用CSingleLock的成员函数UnLock()来实现的。
3.信号量
信号量的用法和互斥的用法很相似,不同的是它可以同一时刻允许多个线程访问同一个资源,创建一个信号量需要用Csemaphore类声明一个对象,一旦创建了一个信号量对象,就可以用它来对资源的访问技术。要实现计数处理,先创建一个CsingleLock或CmltiLock对象,然后用该对象的Lock()函数减少这个信号量的计数值,Unlock()反之。
本任务中采用临界区同步类。
 
【车载以太网】【SOMEIP】Wireshark测试someip 一、 Wireshark SOMEIP plugin 1.1 插件安装 Wireshark插件目录:Help -> About Wireshark -> Folders/Pluginshttps://github.com/jamores/eth-ws-someip 解压后,将所有后缀是lua的文件拷贝到Wireshark安装目录plugins/2.4.10/下。 1.2时间戳调整为UTC显示格式 View -> Time Display Format -> Date and Tim. 阅读详情

相关推荐

【win11】主板更新之后pin不可用,恢复方法

台式机的主板更新了BIOS,再开机竟然登录不进去系统了。 登录界面上显示:【由于此设备上的安全设置已更改,你的pin码不再可用。单击以重新设置pin】 点击【单击以重新设置pin】没有任何反应。 也没有密码登录选项。 在网上找到解决方法,不用PE,只需要按步骤操作即可。通过实际验证可行,现记录如下。

1万+

多线程(并发执行)

一、概念区分 1、并行与并发 并行 ​ 当系统有一个以上CPU时,同一时刻,当一个CPU在执行一个任务时,另一个CPU在执行另一个任务,两个任务互不抢占CPU资源,可以同时进行(多核CPU,一个CPU执行一个进程) 并发 ​ 一个CPU,同一时间,有多个任务在执行。但并发不是真正意义上的“同时进行”,只是将CPU划分成好几个时间片段,每个片段内执行一个任务,然后在这几个片段之间来回切换,由于CPU处理速度快,让用户感觉像是多个任务在同时执行。 区别: 并行是某一时刻,真正有多个程序在运行;并发是在一段时

weixin_42556307的博客 1万+

Dell R730安装Windows Server 2008 R2

一、RAID驱动准备  在安装Windows server2008 R2操作系统时,如果没有发现硬盘,请将下面的阵列卡驱动先解压(在下载的.exe文件,双击点下一步会自动解压),解压后把那文件夹复制到U盘中。阵列卡 PERC9 H330 - H730 - H730P - H830 Controllers for Windows Server 2008 R2二、系统安装方法方法一:光盘安装  ①请您...

MarshLin 2万+

【多线程】并发处理

并发处理一、业务场景二、fork/join框架1、 示意图2、简单demo二、CountDownLatch实现并发效果三、FutureTask1、简单demo2、源码分析3、自己实现一个FutureTask 一、业务场景 分布式系统中调用多个系统接口,汇总数据处理结果 数据处理,结果统计 二、fork/join框架 1、 示意图 递归、分而治之 工作窃取 2、简单demo public c...

marry44750的博客 749

Windows 24H2升级后eNSP AR_40报错40?VirtualBox虚拟化修复指南

虚拟化技术通过Hypervisor在操作系统与硬件间建立抽象层,使虚拟机能够共享物理资源。其核心原理依赖CPU的VT-x/AMD-V指令集,而Windows 24H2对内核隔离与驱动签名的强化会直接占用或拦截这些虚拟化资源。在工程实践中,VirtualBox作为Type-2型Hypervisor,常因内存完整性开启或版本过旧导致虚拟网卡创建失败,进而引发设备启动中断。典型场景包括网络仿真实验、多系统测试环境搭建等。当eNSP的AR_40路由器依赖VirtualBox引擎时,24H2的安全策略变更便会触发错误

weixin_34375251的博客 215

工业视觉光源频闪控制的三种核心模式与选型实战

本文深入解析工业视觉系统中光源频闪控制的三种核心模式:光源主控、相机主控与硬同步。针对高速飞拍、缺陷检测等场景,详细对比了各模式的时序原理、硬件要求与适用场景,并提供了基于产线速度与检测需求的实战选型指南,帮助工程师有效消除运动模糊、提升成像质量与系统稳定性。

weixin_29299807的博客 430

多线程并发的一些解决思路

一、利用不变性解决并发问题 不变性(Immutability)模式。所谓不变性,简单来讲,就是对象一旦被创建之后,状态就不再发生变化。换句话说,就是变量一旦被赋值,就不允许修改了(没有写操作);没有修改操作,也就是保持了不变性。 可以将一个类所有的属性都设置成 final 的,并且只允许存在只读方法,那么这个类基本上就具备不可变性了。 Java SDK 里很多类都具备不可变性,例如经常用到的 String 和 Long、Integer、Double 等基础类型的包装类都具备不可变性,这些对象的线程安全性都是

zhaozhen的博客 4002

Altera Cyclone4 EP4CE15F17C8核心板硬件设计避坑指南(附AD09工程文件)

本文深入解析Altera Cyclone4 EP4CE15F17C8核心板硬件设计中的关键问题与解决方案,涵盖电源架构优化、信号完整性处理、热设计及生产调试要点。特别提供经过验证的AD09工程文件,帮助开发者规避常见设计陷阱,提升FPGA项目的成功率与可靠性。

weixin_29159441的博客 296

多线程并发执行及解决方法

用一个案例来说明:假如我们要实现一个售票的小功能,用3个线程售出共2000张票。 初始模型为: package com.test7; public class synchronizedTest { public static void main(String [] args){ TicketWindow tw = new TicketWindow(); ...

little_spice的博客 4506

uniapp [微信小程序] - 详解微信小程序端接入mqtt全流程及示例源码教程,uniApp微信小程序端如何接入MQTT插件并实现连接/断开+发布订阅+消息队列+离线重连等各种示例代码(开箱即用)

uniapp微信小程序接入MQTT,uniapp中使用mqtt,uniapp 微信小程序端接入mqtt示例代码教程,适用于微信小程序的MQTT插件,uniapp开发微信小程序连接mqtt,uniApp微信小程序接入MQTT协议,uniapp vue3微信小程序使用MQTT的小例子接入流程,使用uniapp开发小程序接入mqtt,如何在uniapp项目中使用mqtt,uniapp mqtt的使用示例,mqtt连接报错,如何在项目里集成mqtt,Mqtt协议,主动连接mqtt,订阅消息,实现发布,订阅和接收消息

🏆 前端领域优质创作者 2880

通俗范畴论10 泛性质(MD版)

既然泛性质可以在同构意义下唯一确定一个泛构造,那么我们就可以用泛性质来定义泛构造。我们回顾一下已经掌握的泛性质和泛构造。泛性质其实我们并不陌生,始对象和终对象,就是具有泛性质的对象,一个具有“始”的泛性质,一个具有“终”的泛性质。比如始对象,如果一个范畴里面有始对象,它到所有对象都有且只有一个态射,这样的对象可能有两个么?嗯,还真可能,但是这两个始对象同构,所以在同构意义下,它们可以看成一个,因此在同构意义下,始对象是唯一的。同理,终对象也一样。同构的始对象。

RockTec的专栏 478

并发操作之——多线程实现的几种方式

并发操作 并发操作之——多线程 并发操作之——多线程并发操作前言一、实现多线程有几种方式?1、继承Thread类优点:缺点:2、实现Runnabel接口二、1、通过Callable和FutureTask方式优点:缺点:2、通过线程池创建优点:缺点:总结 前言 并发操作之——多线程。 一、实现多线程有几种方式? 1、继承Thread类 示例代码: /** * @author Cym * @date 2021/8/30 */ public class Thread extends java.lan

weixin_42397937的博客 7631

Ubuntu\linux,加载mcp2515的驱动,链接mcp2515,mcp2515的这个驱动默认在linux内核中。jetson nao、香橙派、树莓派

3. 其他文章,还要进行驱动编译就比较复杂了(不推荐)1.树莓派+MCP2515+

pvmsmfchcs的博客 1563

Java 并发(多线程)超详细

超级详细解析了 Java 多线程的应用等

qq_42689380的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java多线程编程与并发处理

本文详细介绍了Java中的多线程编程和并发处理,包括线程的创建与生命周期、线程同步与锁机制、并发库和高级并发工具等。通过代码示例和表格总结,希望读者能更好地理解和应用Java的多线程编程,提高程序性能和资源利用率。

weidl001的博客 1501

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

多进程、多线程处理并发

如下图所示, 当一个客户端与服务器建立连接以后,服务器端 accept()返回,进而准备循环接收客户端发过来的数据。如果客户端暂时没发数据,服务端会在第 40 行的 recv()阻塞。此时,其他客户端向服务器发起连接后,由于服务器阻塞了,无法执行 accept()接受连接,也就是其他客户端发送的数据,服务器无法读取。服务器也就无法并发同时处理多个客户端。

ljy的博客 842

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

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

多线程与并发

程序:是为了完成某个特定的任务,而用某种语言编写的一组指令的集合,即指的是一段静态的代码,静态对象。进程:是程序的一次执行过程,或是一个正在运行的程序。是一个动态的过程:有它自身的产生、存在、和消亡的过程——生命周期。线程:进程可进一步细化为线程,是一个程序内部的执行的路径。若一个进程同一时间并行执行多个线程,就是支持多线程的。

_山月见光的博客 3232

多线程并发解决方案

1.继承 Thread 类,重写run方法。(1)run()方法是由jvm创建完操作系统级线程后回调的方法,不可以手动 调用,手动调用相当于调用普通方法。2.实现 Runnable 接口,重写run方法。(1)可以避免java中的单继承的限制(2)线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类3.实现 Callable 接口,重写call方法。

weixin_43815048的博客 1805

Java中Synchronized的使用

在编程中,经常需要用到同步,这里讲一下synchronized关键字的相关知识 1.使用方式 修饰一个代码块,被修饰的代码块称为同步代码块,作用范围是大括号{}括起来的代码; 修饰一个方法,被修饰的方法称为同步方法,其作用范围是整个方法; 修改一个静态方法,作用范围是整个静态方法; 修改一个类,作用范围是synchronized后面括号括起来的部分。 2.使用示例 修饰代码块 注:this 表...

程序员小强的博客 2万+

多线程高并发

1.JMM数据原子操作 read(读取)∶从主内存读取数据 load(载入):将主内存读取到的数据写入工作内存 use(使用):从工作内存读取数据来计算 assign(赋值):将计算好的值重新赋值到工作内存中 store(存储):将工作内存数据写入主内存 write(写入):将store过去的变量值赋值给主内存中的变量 lock(锁定):将主内存变量加锁,标识为线程独占状态 unlock(解锁):将主内存变量解锁,解锁后其他线程可以锁定该变量 2.来看volatile关键字 (1)启动两个线程 p

ZHANGLIZENG的博客 2254

多 线 程

多线程 1.并发与并行 并行:指两个或多个事件在同一时刻发生(同时执行)。 并发:指两个或多个事件在同一个时间段内发生(交替执行)。 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单 CPU 系统中,每一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分时交替运行的时间是非常短的。 而在多个 CPU 系统中,则这些可以并发执行的程序便可以分配到多个处理器上(CPU),实现多任务并行执行,即利用每个处理器来处理一个可以并发

qq_44736296的博客 787

[java进阶]——多线程Thread类,处理并发异常的方法

3.1创建一个类继承Thread子类重写里面的run方法 - 线程要处理的任务创建该类@Override//线程要执行的方法/** 线程的第一种创建方式thread* 1.创建一个类继承thread* 2.重写里面的run方法* 3.创建该类* */3.2定义一个runable接口的实现类重写run方法创建runable实现类据实现类创建Thread类@Override//线程要执行的方法/** 线程的第二种实现方式* 1.定义一个类实现runable接口。

Panci_的博客 655

java 多线程:数据较多,分给多个线程并发处理

1. 构建一个数据列表 2. 将数据按照5个线程均分,每个线程拿到均分的数据 3. 主线程通过等待5个处理数据线程处理好后最后停止 4. 线程处理的结果信息返回 5. 比较不是并发的情况,并发5个线程是远快与一个线程处理的 public class ThreadTest2 { private List<String> msg = new ArrayList(); private List<String> spliteList =...

zhuchunyan_aijia的博客 5035

2.多线程并发

1.说说你知道的创建线程的方式 1、继承Thread类,重写run方法。 2、实现Runnable接口,重写run方法。 3、实现Callable接口,重写call方法。 4、通过线程池创建线程。 2.说说Runnable和Callable的区别

weixin_37624195的博客 1403

Java多线程:并发编程(三)

进程:进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)。 线程:一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数

weixin_46204877的博客 2254

关于避免多线程并发的处理问题

使用synchronized可以控制多线程并发导致的同时调用同一数据的问题,例如三个售票窗口同时售票的问题,为了防止其他窗口出售已经出售了的车票,可以采用synchronized来处理,具体代码如下/* * 功能:模拟车站三窗口售票线程,防止多窗口同时出售同一张票 */ package Demo14; public class Demo14_5 { public static void ...

xzy15047220045的博客 2148
上一篇: Target Team工作任务及签到表(翟超)
下一篇: 没有提交日志的成员,请马上提交工作日志和工作任务源代码(梓文)
TargetStudio
博客等级 码龄20年 3粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值