lock invoke 死锁事例
代码如下:
using System; using System.Collections.Generic; using System.Windows.Forms; using System.Threading; namespace TestThread { public partial class Form3 : Form { //死锁 LongLock mCnt = new LongLock(); public Form3() { InitializeComponent(); mCnt.mEventChanged += mCnt_mEventChanged; } void mCnt_mEventChanged(string arg1, long arg2, bool arg3) { this.Invoke(new Action( () => { this.Text = mCnt.Value.ToString(); Application.DoEvents(); })); } private void Form3_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { ; ) { Random random = new Random(); Thread t = new Thread(new ThreadStart( () => { Thread.Sleep(random.Next(, )); mCnt.Plus(Environment.TickCount.ToString()); })); t.Start(); Thread.Sleep(); }//end while } } public class LongLock { object _objLock = null; HashSet<string> _hashSet = null; public event Action<string, long, bool> mEventChanged; public LongLock() { _hashSet = new HashSet<string>(); _objLock = new object(); } public int Value { get { lock (_objLock) { return _hashSet.Count; } } } public void Plus(string id) { lock (_objLock) { if (!_hashSet.Contains(id)) { _hashSet.Add(id); Notice(id, _hashSet.Count, true); } } } public void Minus(string id) { lock (_objLock) { if (_hashSet.Contains(id)) { _hashSet.Remove(id); Notice(id, _hashSet.Count, true); } } } void Notice(string id, long value, bool isPlus) { if (mEventChanged != null) { mEventChanged(id, value, isPlus); } } } public class LongLock2 { object _objLock = null; HashSet<string> _hashSet = null; public event Action<string, long, bool> mEventChanged; public LongLock2() { _hashSet = new HashSet<string>(); _objLock = new object(); } public int Value { get { lock (_objLock) { return _hashSet.Count; } } } public void Plus(string id) { bool b = false; ; lock (_objLock) { if (!_hashSet.Contains(id)) { b = true; _hashSet.Add(id); value = _hashSet.Count; } } if (b) { Notice(id, _hashSet.Count, true); } } public void Minus(string id) { bool b = false; ; lock (_objLock) { if (_hashSet.Contains(id)) { b = true; _hashSet.Remove(id); value = _hashSet.Count; } } if (b) { Notice(id, value, false); } } void Notice(string id, long value, bool isPlus) { if (mEventChanged != null) { mEventChanged(id, value, isPlus); } } } }
lock invoke 死锁事例的更多相关文章
- Gimbal Lock欧拉角死锁问题
技术背景 在前面几篇跟SETTLE约束算法相关的文章(1, 2, 3)中,都涉及到了大量的向量旋转的问题--通过一个旋转矩阵,给定三个空间上的欧拉角\(\alpha, \beta, \gamma\), ...
- C# Winform 界面线程的Invoke死锁,以及Application.DoEvent的问题
1.对于非界面线程来说,Invoke是把一个操作丢到界面线程的队列里,然后阻塞,等到这个操作被界面线程完成后,才继续后续操作.也就是说,Invoke是同步的. 问题来了,如果界面线程此时正在等待这个非 ...
- 并发、并行、同步、异步、全局解释锁GIL、同步锁Lock、死锁、递归锁、同步对象/条件、信号量、队列、生产者消费者、多进程模块、进程的调用、Process类、
并发:是指系统具有处理多个任务/动作的能力. 并行:是指系统具有同时处理多个任务/动作的能力. 并行是并发的子集. 同步:当进程执行到一个IO(等待外部数据)的时候. 异步:当进程执行到一个IO不等到 ...
- java中同步嵌套引起的死锁事例代码
/* 目的:自己写一个由于同步嵌套引起的死锁! 思路:多个线程在执行时,某一时刻,0-Thread绑定了LockA锁,1-Thread绑定了LockB锁! 当0-Thread要去绑定LockB锁时 和 ...
- C# lock 死锁问题排查方法
多线程程序发生死锁,某些重要线程卡住,不正常工作.排查起来非常麻烦.以下内容记录排查方法 1.确定死锁的位置,一般死锁会lock到某一行具体的代码,比如我就死锁在类似如下代码中 public void ...
- Java线程之如何分析死锁及避免死锁
什么是死锁 java中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java死锁情况出现至少两个线程和两个或更多资源. 在这里,我们将写了一个简单的程序,它将导致java死锁场景,然后我们将分析 ...
- 一个 Linux 上分析死锁的简单方法
简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这 ...
- Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures
参考博客: https://www.cnblogs.com/xiao987334176/p/9046028.html 线程简述 什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线 ...
- python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)
昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...
随机推荐
- php中数据库服务器连接类库文件的编写
<!--数据库服务器连接类库文件的编写--> <?php class mysql{ //连接服务器.数据库以及执行Sql语句的类库 public $database; public ...
- shell脚本监控目录下文件被篡改时报警
思路: 目录下文件被篡改的几种可能: 1.被修改 2.被删除 3.新增文件 md5命令详解 参数: -b 以二进制模式读入文件内容 -t 以文本模式读入文件内容 -c 根据已生成的md5值,对现存文件 ...
- vue的使用总结
1.vue的生命周期
- poptest老李谈数据库优化总结
poptest老李谈数据库优化总结 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088 ...
- 手机自动化测试:appium源码分析之bootstrap十四
手机自动化测试:appium源码分析之bootstrap十四 poptest(www.poptest.cn)是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开 ...
- js正则表达式匹配字符串与优化过程
前言 有时候需要实现对js源文件中的url字符串做拦截预处理,或者前端js语法高亮,或者需要对动态加载的关键源码做混淆保护,在某些步骤实现之前,有一个步骤是需要提炼出所有的合法字符串. 目标:检测源文 ...
- 漫谈PHP代码规范
前言 虽说PHP是世界上最好的语言,但是写出来的PHP代码却往往不是最美观的.究其原因,可能正式因为PHP简单易上手,适合快速迭代的特性,导致了我们沉浸在迅速完成需求迭代的窃喜中,却忘记了规范性.忽略 ...
- shell脚本练习题
下面列出了几个linux学习中的shell脚本题目 1.九九乘法表 #!/bin/bash echo "九九乘法表" # 注意((之间不能有空格.加减乘除的格式.还有转义字符\*. ...
- python作业设计:多级菜单,并可依次进入各级子菜单
'''作业三:多级菜单 三级菜单 可依次选择进入各子菜单 所需新知识点:列表.字典 ''' data = { "北京":{ "昌平":{ "沙河&qu ...
- Spring Dubbo 开发笔记
第一节:概述 Spring-Dubbo 是我自己写的一个基于spring-boot和dubbo,目的是使用Spring boot的风格来使用dubbo.(即可以了解Spring boot的启动过程又可 ...