【实例简介】用.net C#实现两张图像的相似度对比功能

文件:590m.com/f/25127180-490252161-500aa3(访问密码:551685)

【实例截图】



以下内容无关:

-------------------------------------------分割线---------------------------------------------

认识 Semaphore
Semaphore 是什么
Semaphore 一般译作 信号量,它也是一种线程同步工具,主要用于多个线程对共享资源进行并行操作的一种工具类。它代表了一种许可的概念,是否允许多线程对同一资源进行操作的许可,使用 Semaphore 可以控制并发访问资源的线程个数。

Semaphore 的使用场景
Semaphore 的使用场景主要用于流量控制,比如数据库连接,同时使用的数据库连接会有数量限制,数据库连接不能超过一定的数量,当连接到达了限制数量后,后面的线程只能排队等前面的线程释放数据库连接后才能获得数据库连接。

再比如交通公路上的红绿灯,绿灯亮起时只能让 100 辆车通过,红灯亮起不允许车辆通过。

再比如停车场的场景中,一个停车场有有限数量的车位,同时能够容纳多少台车,车位满了之后只有等里面的车离开停车场外面的车才可以进入。

Semaphore 使用
下面我们就来模拟一下停车场的业务场景:在进入停车场之前会有一个提示牌,上面显示着停车位还有多少,当车位为 0 时,不能进入停车场,当车位不为 0 时,才会允许车辆进入停车场。所以停车场有几个关键因素:停车场车位的总容量,当一辆车进入时,停车场车位的总容量 - 1,当一辆车离开时,总容量 + 1,停车场车位不足时,车辆只能在停车场外等待。

public class CarParking {

private static Semaphore semaphore = new Semaphore(10);public static void main(String[] args){for(int i = 0;i< 100;i++){Thread thread = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("欢迎 " + Thread.currentThread().getName() + " 来到停车场");// 判断是否允许停车if(semaphore.availablePermits() == 0) {System.out.println("车位不足,请耐心等待");}try {// 尝试获取semaphore.acquire();System.out.println(Thread.currentThread().getName() + " 进入停车场");Thread.sleep(new Random().nextInt(10000));// 模拟车辆在停车场停留的时间System.out.println(Thread.currentThread().getName() + " 驶出停车场");semaphore.release();} catch (InterruptedException e) {e.printStackTrace();}}}, i + "号车");thread.start();}}

}
在上面这段代码中,我们给出了 Semaphore 的初始容量,也就是只有 10 个车位,我们用这 10 个车位来控制 100 辆车的流量,所以结果和我们预想的很相似,即大部分车都在等待状态。但是同时仍允许一些车驶入停车场,驶入停车场的车辆,就会 semaphore.acquire 占用一个车位,驶出停车场时,就会 semaphore.release 让出一个车位,让后面的车再次驶入。

Semaphore 信号量的模型
上面代码虽然比较简单,但是却能让我们了解到一个信号量模型的五脏六腑。下面是一个信号量的模型:

来解释一下 Semaphore ,Semaphore 有一个初始容量,这个初始容量就是 Semaphore 所能够允许的信号量。在调用 Semaphore 中的 acquire 方法后,Semaphore 的容量 -1,相对的在调用 release 方法后,Semaphore 的容量 + 1,在这个过程中,计数器一直在监控 Semaphore 数量的变化,等到流量超过 Semaphore 的容量后,多余的流量就会放入等待队列中进行排队等待。等到 Semaphore 的容量允许后,方可重新进入。

Semaphore 所控制的流量其实就是一个个的线程,因为并发工具最主要的研究对象就是线程。

它的工作流程如下

这幅图应该很好理解吧,这里就不再过多解释啦。

Semaphore 深入理解
在了解 Semaphore 的基本使用和 Semaphore 的模型后,下面我们还是得从源码来和你聊一聊 Semaphore 的种种细节问题,因为我写文章最核心的东西就是想让我的读者 了解 xxx,看这一篇就够了,这是我写文章的追求,好了话不多说,源码走起来!

Semaphore 基本属性
Semaphore 中只有一个属性

private final Sync sync;
Sync 是 Semaphore 的同步实现,Semaphore 保证线程安全性的方式和 ReentrantLock 、CountDownLatch 类似,都是继承于 AQS 的实现。同样的,这个 Sync 也是继承于 AbstractQueuedSynchronizer 的一个变量,也就是说,聊 Semaphore 也绕不开 AQS,所以说 AQS 真的太重要了。

Semaphore 的公平性和非公平性
那么我们进入 Sync 内部看看它实现了哪些方法

abstract static class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 1192457210091910933L;

Sync(int permits) {
setState(permits);
}

final int getPermits() {
return getState();
}

final int nonfairTryAcquireShared(int acquires) {
for (;

.net C#实现图像对比相关推荐

  1. R语言使用plot函数和lines函数可视化线图(line plot)时、图之间的主要区别是由选项type产生的、type参数常用参数说明、不同type生成的可视化图像对比

    R语言使用plot函数和lines函数可视化线图(line plot)时.图之间的主要区别是由选项type产生的.type参数常用参数说明.不同type生成的可视化图像对比 目录

  2. 『原创』+『参考』基于PPC的图像对比程序——使用直方图度量

    前言的前言: 最近小弟闲来无聊,就想到了在PPC上面来做个图像对比的小东东,查找各方资料,终于在今天初步完成了这个程序,现在整理之后和各位共勉.程序中还存在很多不足之处,大家尽管提出自己的意见和建议, ...

  3. android 图像对比,图像对比在UI自动化中的应用

    引子 继多版本模拟器的支持工作告一段落之后,如何利用这些技术产生更大的价值,成为了接下来需要思考的问题.当然,接下来的课题就涉及到了今天的图像对比技术.说来有点内疚,虽然也算是科班出身,只可惜大学还没 ...

  4. 图像对比算法有哪些,图像对比算法是什么

    图像比对的原理或者算法 原理如下:首先两张图要配准(可以姑且理解为对准),然后做减法就可以得到两张图不同的地方.题主可以先从图像配准开始学习. 关于编程语言和工具:在C/C++下的图像处理库OpenC ...

  5. 机器图像识别常用算法,图像对比识别技术

    图像识别算法都有哪些 图像识别算法:1人脸识别类(Eigenface,Fisherface算法特别多),人脸检测类(j-v算法,mtcnn)2车牌识别类,车型识别类(cnn)3字符识别(cnn)... ...

  6. android 图像对比,Android中比较两个图片是否一致的问题

    在Fragment界面中,设置两个图片一致如下: 默认设置图片为: binding.ivArrow.setImageResource(R.drawable.icon_down); 先获取默认图片,再和 ...

  7. python图像对比_用python实现对比两张图片的不同

    from PIL import Image from PIL import ImageChops def compare_images(path_one, path_two, diff_save_lo ...

  8. python图像对比_python+PIL实现图片对比(一)

    前提 前阵子报了个班,学了一些android UI自动化相关的东西,于是想到第一家单位在做android手机自动化的时候,有用到图片对比,来确定是否点到指定的页面,遂想在appium+python做U ...

  9. Vue实现 “前后”图像对比效果

    效果如下图所示,拉动中间的按钮,把处理过的图片和没有处理过的图片做一个对比~ 创建一个CompareImage.vue组件,代码如下: <template id="compare-te ...

  10. MATLAB对图像加噪声处理与加维纳滤波后的图像对比

    I = imread('eight.tif'); subplot(221),imshow(I) title('原图像') J = imnoise(I,'gaussian',0,0.005); %图像中 ...

最新文章

  1. 【RocketMQ工作原理】订阅关系的一致性
  2. win7 计算机右键没有属性,系统之家windows7旗舰版计算机上右键菜单没有属性怎么办?...
  3. google nexus5x 刷机抓包逆向环境配置(二)
  4. OpenCV-Python:模板匹配
  5. TextBox和DataGridView控件的事件发生顺序
  6. 退出域不能够重新加入域,郁闷呀
  7. 一个项目有两个pom_Python Selenium设计模式之POM设计模式
  8. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in position 24: invalid start byte
  9. 高中二年级会考计算机考试试题,高中二年级学考是怎么回事 和会考的区别是什么...
  10. L1-030 一帮一 (15 分)
  11. SpringBoot 整合 liquibase
  12. VMWare安装Ubuntu 16.04
  13. 与代数式xyz所对应的C语言表达式是,C程序习题集讲解.doc
  14. 《硬核干货》简单好用视频、图片、文件MD5值修改工具类
  15. 西北工业大学网络空间安全考研经验分享
  16. VUE3使用keep-alive页面切换时报错:parentComponent.ctx.deactivate is not a function
  17. Thinkphp3.2(tp3.2) sql语句表达式查询字符列表【eq,neq,gt,egt,lt,elt,in,between,like,exp】
  18. MySQL-Workbench数据库备份
  19. nginx配置华为云ssl证书
  20. 实时可视化大数据项目05 -- UI界面

热门文章

  1. SUSE12 sp1如何进入单用户模式
  2. 通过adb命令查看手机中sp xml文件
  3. 国产高清卫星影像时代来了,打造中国版“谷歌地球”!
  4. 360无线网卡驱动服务器,360无线网卡驱动
  5. java考勤表导出_考勤打卡机导出的excel考勤时间表如何生成实用的考勤表
  6. Redis更新数据的时候如何不重置过期时间
  7. Mac/Macbook Apple ID 无法登录:验证失败,发生未知错误
  8. 辨别 优盘 真假 [金士顿]
  9. html组件做成圆角,css3制作圆角按钮
  10. papi酱微博数据可视化(截至2020年12月9日)