“黑马程序员”线程同步的问题

IC/FPGA笔试/面试题分析(七)建立时间和保持时间类型考题汇总分析 自从召集2020届校招同行加入新建立的“IC/FPGA校招笔试面试交流群“,见识到了很多关于建立时间和保持时间分析的题目,在为别人解答疑惑,以及别人为自己解答疑惑的同时,自己对于知识的理解更加深刻了。 对于建立时间而言,从单独的对触发器的建立时间和保持时间的分析到了对电路(系统)的建立时间到保持时间的分析,前者是核心,后者是扩展,后者建立在前者的基础之上进行推到得到,同时也是芯片内部实际遵循的时... 阅读详情

 ----------------- android培训、java培训、期待与您交流! ----------------------


学了张孝祥老师用到一些线程的同步机制,故转载线程的四种同步机制如下:

1、  Event
用事件(Event)来同步线程是最具弹性的了。一个事件有两种状态:激发状态和未激发状态。也称有信号状态和无信号状态。事件又分两种类型:手动重置事件和自动重置事件。手动重置事件被设置为激发状态后,会唤醒所有等待的线程,而且一直保持为激发状态,直到程序重新把它设置为未激发状态。自动重置事件被设置为激发状态后,会唤醒“一个”等待中的线程,然后自动恢复为未激发状态。所以用自动重置事件来同步两个线程比较理想。MFC中对应的类为CEvent.。CEvent的构造函数默认创建一个自动重置的事件,而且处于未激发状态。共有三个函数来改变事件的状态:SetEvent,ResetEvent和PulseEvent。用事件来同步线程是一种比较理想的做法,但在实际的使用过程中要注意的是,对自动重置事件调用SetEvent和PulseEvent有可能会引起死锁,必须小心。

2、  Critical Section
使用临界区域的第一个忠告就是不要长时间锁住一份资源。这里的长时间是相对的,视不同程序而定。对一些控制软件来说,可能是数毫秒,但是对另外一些程序来说,可以长达数分钟。但进入临界区后必须尽快地离开,释放资源。如果不释放的话,会如何?答案是不会怎样。如果是主线程(GUI线程)要进入一个没有被释放的临界区,呵呵,程序就会挂了!临界区域的一个缺点就是:Critical Section不是一个核心对象,无法获知进入临界区的线程是生是死,如果进入临界区的线程挂了,没有释放临界资源,系统无法获知,而且没有办法释放该临界资源。这个缺点在互斥器(Mutex)中得到了弥补。Critical Section在MFC中的相应实现类是CcriticalSection。CcriticalSection::Lock()进入临界区,CcriticalSection::UnLock()离开临界区。

3、  Mutex
互斥器的功能和临界区域很相似。区别是:Mutex所花费的时间比Critical Section多的多,但是Mutex是核心对象(Event、Semaphore也是),可以跨进程使用,而且等待一个被锁住的Mutex可以设定TIMEOUT,不会像Critical Section那样无法得知临界区域的情况,而一直死等。MFC中的对应类为CMutex。Win32函数有:创建互斥体CreateMutex() ,打开互斥体OpenMutex(),释放互斥体ReleaseMutex()。Mutex的拥有权并非属于那个产生它的线程,而是最后那个对此Mutex进行等待操作(WaitForSingleObject等等)并且尚未进行ReleaseMutex()操作的线程。线程拥有Mutex就好像进入Critical Section一样,一次只能有一个线程拥有该Mutex。如果一个拥有Mutex的线程在返回之前没有调用ReleaseMutex(),那么这个Mutex就被舍弃了,但是当其他线程等待(WaitForSingleObject等)这个Mutex时,仍能返回,并得到一个WAIT_ABANDONED_0返回值。能够知道一个Mutex被舍弃是Mutex特有的。

4、  Semaphore
信号量是最具历史的同步机制。信号量是解决producer/consumer问题的关键要素。对应的MFC类是Csemaphore。Win32函数CreateSemaphore()用来产生信号量。ReleaseSemaphore()用来解除锁定。Semaphore的现值代表的意义是目前可用的资源数,如果Semaphore的现值为1,表示还有一个锁定动作可以成功。如果现值为5,就表示还有五个锁定动作可以成功。当调用Wait…等函数要求锁定,如果Semaphore现值不为0,Wait…马上返回,资源数减1。当调用ReleaseSemaphore()资源数加1,当时不会超过初始设定的资源总数。

感觉本科时操作系统课最大的失败就是没让我们实践多线程的概念、同步机制、IPC等等……

其中一种同步实现代码如下:

package testFanxing;


import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class tongbuThread {
public static void main(String[] args) {
tongbuThread thread = new tongbuThread();
thread.init();
}


public void init() {
final output o = new output();
new Thread(new Runnable() {
@Override
public void run() {
o.subPrint();
}
}).start();
o.main();
}


class output {
Lock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
boolean subshould = true;


public void subPrint() {
for (int j = 1; j < 51; j++) {
// synchronized (this) {
lock.lock();
try {
while (!subshould) {
try {
// this.wait();
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 1; i < 11; i++) {
System.out.println("subThread----" + j + "-------" + i);
}
subshould = false;
condition2.signal();
} finally {
lock.unlock();
}


// this.notify();
}
// }
}


public void main() {
for (int j = 1; j < 51; j++) {
lock.lock();
// synchronized (this) {
try {
while (subshould) {
try {
// this.wait();
condition2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < 101; i++) {
System.out.println("mainThread-----" + j + "---------"
+ i);
}
subshould = true;
condition1.signal();
} finally {
lock.unlock();
}
// this.notify();
}
// }
}
}
}

---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.youkuaiyun.com/heima



基于 Google Colab 的 mask rcnn 训练自己的数据集(以实例分割为例) 详细步骤1 数据集的制作1.1 数据标注1.2 生成数据集2 环境的搭建2.1 搭建流程2.2 注意事项(报错)3 开始训练4 可视化4.1 修改webcam.py文件4.2 进行可视化5 参考文章 1 数据集的制作 1.1 数据标注 使用 labelme=4.5.6 版本进行标注,标注文件指定到保存图片的路径下,也就是json文件和jpg文件放在同一个文件夹里 1.2 生成数据集 先手动划分训练集和测试集(包括图像和标注文件),然后分别整合它们的标注信息,参考代码:1_ships_to_coco.py 阅读详情

相关推荐

【数学建模】编程手学习路线

在学习过程中,建议注重理论与实践相结合,多进行实例练习和项目实践,以巩固所学知识并提升实际应用能力。同时,保持对新技术和新方法的关注和学习,不断提升自己的专业素养和竞争力。NumPy、Pandas、Matplotlib和Seaborn等库是数据处理和可视化的重要工具。掌握常用机器学习算法的原理和应用,如决策树、支持向量机、神经网络等。学习内容包括微积分、线性方程组、矩阵运算、概率分布、统计推断等。学习内容包括基本语法、函数和模块、面向对象编程、文件操作等。深入了解优化理论和方法,如梯度下降法、牛顿法等。

2301_79586491的博客 2961

线程同步机制

目录 一、线程同步机制 ​ 二、同步方法 ​ 三、同步块 一、线程同步机制 处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象。这时需要线程同步,线程同步是一种等待机制,多个县农村需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个线程再使用 解决方法:队列和锁 保证线程同步的安全性 由于同一进程的多个线程共享一块存储空间,在带来方便的同时,也带来了访问冲突问题,为了保证数据在方法中被访问时的正确性,在访问时加锁

欢迎一起学习交流 4325

【2021工业图像异常检测文献】DRÆM: 基于判别性训练的重建嵌入表面异常检测方法

DRÆM – A discriminatively trained reconstruction embedding for surface anomaly detection

qq_1532145264的博客 1477

线程同步机制的三种方法

线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 模拟售票案例 创建3个线程,同时开启,对共享的票进行出售 public class Demo01Ticket { public static void main(String[] args) { //创建Runnable接口的实现类对象 RunnableImpl run = new Runnable

好好学习 1592

从玩具到工业:手把手教你用Webots仿真Scara抓取(逆解实战篇)

本文详细介绍了如何在Webots仿真环境中实现Scara机械臂的逆解计算与抓取操作,涵盖从环境配置、逆运动学算法到轨迹规划与实时控制的完整流程。通过实战案例演示,帮助读者掌握机械臂逆解的核心技术,并应用于工业自动化场景,提升Scara机械臂的编程与控制能力。

weixin_30932215的博客 504

工业相机的检测原理课件(建议收藏)

本课件为各位工程师详细介绍了工业相机的视觉检测原理 ,旨在为工程师调试工业相机的视觉检测原理时提供理论性指导。

Bamboo265925的博客 498

线程的同步机制

线程怎么实现同步 前文有提到,一个进程中的各个线程都有共享的资源而且是完全开放的,那么在进程运行中会出现多个线程访问同一个公共资源的问题。 这种现象我们称之为线程之间产生了资源竞争,这种竞争会导致程序异常甚至崩溃。 Linux提供了相应的解决方案,来确保每个线程能同步的访问进程提供的公共资源,线程同步。简而言之,就是排排队大家一个一个来! 线程同步四种方法: 互斥锁 信号量 条件变量 读写锁 互斥锁:又称互斥体或互斥量,是最简单的一种线程同步机制,顾名思义,当一个线程访问的时候,就会把资源“锁”上,直到

weixin_42624592的博客 1824

109. SAP ABAP 应用程序中的锁机制和工作原理介绍

SAP ABAP 系统中的锁概念,是 SAP ABAP 为了保证`数据一致性`而引入的一种保护机制。 像 SAP 这种复杂的企业级应用,系统中同一时间段的同一份数据,可能会有多个 Transaction(终端用户或者 API )同时进行读写操作。为了防止出现数据不一致,SAP ABAP 引入了锁机制。 这种锁机制并非数据库服务器层面的锁,而是在 SAP ABAP 应用服务器层面上工作,加锁和解锁都由专门的 ABAP Function Module 来完成。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1467

线程同步有哪些机制

线程同步有哪些机制

博可睿的博客 1230

基于YOLO26/11/v8算法的Web目标检测系统,人脸表情识别系统,Django+Vue3 的前后端分离,实现摄像头实时识别,YOLO26/YOLO11/v8 + LLM大模型智能分析,科研必备

在人工智能迈向通用化(AGI)的今天,“视觉感知 + 语言理解”的多模态联合是未来的趋势。单纯的检测画框已经无法满足复杂的业务需求,如何让系统“看懂”画面并进行“思考”,是当前视觉项目的重点。我们知道目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。因此本项目将 YOLO 目标检测模型(兼容 YOLO26/v11/v8 系列)与 DeepSeek 等顶流大语言模型(LLM) 进行联合,使用 Django (后端) + Vue3 (前端) 技术栈

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2837

【Python机器学习】零基础掌握TweedieRegressor广义线性回归模型

本次文章主要介绍了如何使用Tweedie回归模型预测电动汽车的实际续航里程。基于车速、气温和驾驶习惯等多种因素,模型能够准确地预测出电动汽车的续航里程,从而为生产商和消费者提供有用的信息。优点总结,Tweedie回归模型在处理具有多元性和高度散布的数据方面表现出色,特别适用于需要考虑多种影响因素的预测任务。优点名称对应描述说明多元性强可以同时处理多种类型和维度的数据高度可定制允许用户自定义损失函数和正则项对异常值鲁棒能够较好地处理数据中的异常值易于解释参数和预测结果都相对容易解释。

Mr数据杨 1005

线程同步的四种方式及原理

线程的同步是为了保证多个线程按照特定的顺序、协调地访问共享资源,避免数据不一致和竞争条件等问题。本文说明了四种实现线程同步的方式。

向诸位大佬虚心学习 4419

【GameFramework框架内置模块】6、实体(Entity)

实体Entity就是一个实体的基本单元,类似于Unity的GameObject对象本体,然后这个本体上面附加其他各种各样组件,才能实现各种各样的功能。一般需要在游戏运行时动态加载的游戏对象,比如怪物、武器、子弹、特效,都需要给这个物体挂载一个实体Entity,这样的话就可以方便的对实例出来的对象进行管理。下面就来看一下如何使用吧。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 3137

多线程(黑马程序员学习笔记)

本文是黑马程序员Java视频教程的学习笔记,重点介绍了进程、线程及其在Java中的实现方式。进程是系统资源分配的基本单位,具有独立性、动态性和并发性;线程是进程中的任务执行单元,多线程能提高执行效率。Java中开启线程的方式包括继承Thread类、实现Runnable接口和实现Callable接口,分别适用于不同场景。文章还详细讲解了线程的常用方法,如获取线程名称、线程休眠、设置优先级和守护线程等。此外,探讨了线程安全问题及解决方案,如同步代码块、同步方法和Lock锁,并介绍了死锁的产生条件及避免方法。

A2294249395的博客 1636

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java黑马程序员-多线程笔记

哔哩哔哩java黑马视频笔记

luohanisme的博客 1457

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

黑马程序员线程

------- android培训、java培训、期待与您交流! ---------- 黑马程序员线程 Java中如果我们自己没有产生线程,那么系统就会给我们产生一个线程(主线程,main方法就在主线程上运行),我们的程序都是由线程来执行的。进程:执行中的程序(程序是静态的概念,进程动态的概念)。 当程序启动运行时,就自动产生一个线程,主方法main就在这个主线程上运行。一个进程可以包含

lamstudyingnet的专栏 439

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

黑马程序员——线程的安全问题

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 线程出现安全问题的原因分析 是因为我们通过多个线程对同一数据进行操作时,它的时间片分配是随机的,有可能在票数递减后 线程就将时间片让出,这时其它的线程在执行时,就会在原来票数基础上在递减。 在展示时就会出现同票或负数问题. 这是多线程存在的一些安全问题. 线程安全问题的产生的条件

wnk77521的博客 485

多线程(总结黑马程序员)

是一个程序内部的一条执行流程一个可以复用线程的技术。

m0_56508224的博客 1077

黑马程序员——java中关于同步函数(或同步代码块)解决多线程安全问题的加锁

------- android培训、java培训、期待与您交流! ---------- 重点:多锁解决安全问题(同步静态函数和非静态函数),懒汉式(单例模式的一种)的加锁问题。     先举例说明说明线程的安全问题。 一、     有一个需求:有四个窗口卖票,用java模拟其卖票过程。 需求分析:必须用四个多线程解决。 代码如下: class Tickets impl

flyingfox023的专栏 880

黑马程序员_11线程同步问题、生产者消费者问题

一、线程同步问题 public class TestSynchThread implements Runnable{  static int k = 100;  public synchronized static void m1(){   k=1000;   try{    Thread.sleep(11

besidescrazy的专栏 526

黑马程序员<java基础<多线程同步异步问题>>

多线程 进程:正在进行中的程序 线程:就是进程中一个执行单元或执行情景或执行路径负责进程中程序执行的控制单元 一个进程中至少要有一个线程 当一个进程中线程有多个时,就是多线程 多线程解决的问题:可以让多部分代码同时执行。 什么是同时执行呢?其实都是cpu在瞬间做着快速切换完成的。 cpu的切换随机的,按照时间片的方式来完成。 其实java运行就是多线程的

rina_love__story的博客 469

黑马程序员-线程

Java 线程理解的学习

甘为码农 641

黑马程序员——线程同步的几种方式

------- android培训、java培训、期待与您交流! ---------- ——————————————————————————————————————————————————  1、CountDownLatch一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 public class CountdownLatchTe

u010672262的专栏 544

黑马程序员_多线程

多线程的基础知识

weixin_51429898的博客 1323

【黑马程序员】多线程总结

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-这是我学习多线程两天后对于不明白的地方上网查阅大量资料后,针对一些难点做的一些总结.线程的状态:新建状态:新创建线程对象,但是该线程尚未运行。就绪状态:线程对象创建后,其他线程调用了该对象的start()方法。此线程开始运行,等待获取CPU的使用权。运行状态:就绪状态的线程获取了CPU使用权,开始执行他的run方

u014461902的博客 483

黑马程序员——javase进阶——day09——线程安全,死锁,状态,通讯,线程池

死锁是一种少见的,而且难于调试的错误,在两个线程对两个同步锁对象具有循环依赖时,就会大概率的出现死锁。我们要避免死锁的产生。否则一旦死锁,除了重启没有其他办法的其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。

qq_56444564的博客 1123
上一篇: “黑马程序员”正则表达式的学习日志
tangjinjava
博客等级 码龄16年 0粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值