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调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...
随机推荐
- (16)IO流之输入字节流FileInputStream和输出字节流FielOutputStream
IO流技术解决的问题:设备与设备之间的传输问题,内存-->硬盘,硬盘-->内存,等等 IO流技术 如果按照数据的流向划分可以划分为:输入流和输出流 输入输出的标准是以程序为参考物的,如果流 ...
- PHP生成随机水印图片
基于PHP的GD图形库,自己生成一张图片.仅限初识GD库,实例学习. 一.需求 网站的布局用到了类似慕课网课程列表的风格,每一个课程是一个banner图,图下面是标题加简介.因为课程的数量较大没有为所 ...
- 分离数据库时出错:无法对数据库'XXX' 执行删除,因为它正用于复制"的解决方法
出现的原因是要分离的数据库是一个发布订阅的数据库.因为正在复制,所以无法脱机. 解决办法是停止发布订阅,或者删掉它..再分离.有部分情况是在复制目录下并没有看到发布订阅. 有可能是因为以前建立发布订阅 ...
- canvas 3D雪花效果
<!DOCTYPE html> <html style="height: 100%;"> <head> <meta charset=&qu ...
- Windows 10 Creaters Update 新功能——画中画模式和窗口高斯模糊
在Windows 10 Creaters Update中,可以给窗口设置高斯模糊了,只要几行代码! <Grid Loaded="Grid_Loaded"> <Gr ...
- strtol函数 将字符串转换为相应进制的整数
转自http://hi.baidu.com/qwpsmile/blog/item/9bc44efa4f41018a9f514637.html +----------------+| strt ...
- JavaScript如何一次性展示几万条数据
有一位同事跟大家说他在网上看到一道面试题:“如果后台传给前端几万条数据,前端怎么渲染到页面上?”,如何回答? 于是办公室沸腾了, 同事们讨论开了, 你一言我一语说出自己的方案. 有的说直接循环遍历生成 ...
- POPTEST老李推荐:互联网时代100本必读书,来自100位业界大咖推荐 2
➤NO.30<移动的力量>[推荐人]刘九如:电子工业出版社副社长兼总编辑邬贺铨:中国工程院院士.原副院长汪力成:华立集团董事局主席➤NO.31<智慧社会>[推荐人]段永朝:财讯 ...
- 手机自动化测试:appium问题解决
手机自动化测试:appium问题解决 Appium遇到问题: 问题一:问题org.openqa.selenium.remote.UnreachableBrowserException: Could ...
- 老李推荐: 第3章1节《MonkeyRunner源码剖析》脚本编写示例: MonkeyRunner API使用示例
老李推荐: 第3章1节<MonkeyRunner源码剖析>脚本编写示例: MonkeyRunner API使用示例 MonkeyRunner这个类可以说是编写monkeyrunner脚 ...