C# .netframework 4.5 下的 lock 语法 已经够用了,挺安全的。

news/2025/1/11 8:24:26/文章来源:https://www.cnblogs.com/pencilstart/p/18665137

如果你在一个线程里用 lock语法  锁住了某段数据,当外部粗暴的 abort 或 interrupt 这个线程后,退出线程前,这个 lock 会自动释放了。

我做了一个简单的例子来模拟情况,先是写了一个 类 Class2,里面有一个 int _count 用来在线程间互斥的修改,用一个 _locker 来保护。

提供了四个方法:

start(),创建线程并运行。运行起来,先会用 lock(_locker) 加锁保护,在保护内 _count 加1,然后,就sleep这个线程1小时。1小时到期后,会退出锁保护。

abort(),interrupt(),都会触发上面那个线程中断。

 add(),先会用 lock(_locker) 加锁保护,在保护内 _count 加1,再退出锁保护。

 

然后创建一个FORM,在这个FORM 上有四个按键,一个是创建线程并运行(start thread),另一个是 abort 这个线程,还有一个是 interrupt 这个线程,最后一个是 add 一个值。注意因为 add 时会被锁住,所以,add 这里又创建一个线程去 调用 上面那个类里的 add,这样,界面上的 add 就可以反复按而不住卡住 FORM 主线程。

这是那个 Class2.cs。

using System;
using System.Threading;
using System.Diagnostics;namespace testThreadForm
{public class Class2{private object _locker = new object();private Thread _t = null;private int _count = 0;public void Start(){Debug.WriteLine("[{0}] Start: BEGIN.", Thread.CurrentThread.ManagedThreadId);if (null != _t){_t.Abort();_t.Join();_t = null;}_t = new Thread(new ThreadStart(_backgroundLoop));_t.Start();Debug.WriteLine("[{0}] Start: END.", Thread.CurrentThread.ManagedThreadId);}public void Interrupt(){Debug.WriteLine("[{0}] Interrupt: BEGIN.", Thread.CurrentThread.ManagedThreadId);if (null != _t){_t.Interrupt();}Debug.WriteLine("[{0}] Interrupt: END.", Thread.CurrentThread.ManagedThreadId);}public void Abort(){Debug.WriteLine("[{0}] Abort: BEGIN.", Thread.CurrentThread.ManagedThreadId);if (null != _t){_t.Abort();}Debug.WriteLine("[{0}] Abort: END.", Thread.CurrentThread.ManagedThreadId);}public void Add(){Debug.WriteLine("[{0}] Add: BEGIN.", Thread.CurrentThread.ManagedThreadId);lock (_locker){++_count;Debug.WriteLine("[{1}] ADD: count = {0}", _count, Thread.CurrentThread.ManagedThreadId);}Debug.WriteLine("[{0}] Add: END.", Thread.CurrentThread.ManagedThreadId);}private void _backgroundLoop(){Debug.WriteLine("[{0}] Loop: BEGIN.", Thread.CurrentThread.ManagedThreadId);try{lock (_locker){_count++;Thread.Sleep(1000 * 60 * 60);}}catch (ThreadInterruptedException){Debug.WriteLine("[{0}] Loop: ThreadInterruptedException awoken.",Thread.CurrentThread.ManagedThreadId);}catch (ThreadAbortException){Debug.WriteLine("[{0}] Loop: ThreadAbortException aborted.",Thread.CurrentThread.ManagedThreadId);}finally{Debug.WriteLine("[{0}] Loop: END.", Thread.CurrentThread.ManagedThreadId);}}}
}

这是 主 FORM 里的调用。

using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;namespace testThreadForm
{public partial class Form1 : Form{Class2 c = new Class2();public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){c.Start();}private void button2_Click(object sender, EventArgs e){c.Abort();}private void button3_Click(object sender, EventArgs e){Thread t = new Thread(new ThreadStart(_add));t.Start();}private void _add(){Debug.WriteLine("[{0}] _add: BEGIN", Thread.CurrentThread.ManagedThreadId);c.Add();Debug.WriteLine("[{0}] _add: END", Thread.CurrentThread.ManagedThreadId);}private void button4_Click(object sender, EventArgs e){c.Interrupt();}}
}

这是按如下操作后的结果:

1)按下 start thread

2)按下 add 

3)按下 abort

4)按下 start thread

5)按下 add

6)按下 interrupt

[1] Start: BEGIN.
[1] Start: END.
[3] Loop: BEGIN.
[4] _add: BEGIN
[4] Add: BEGIN.
[1] Abort: BEGIN.
Exception thrown: 'System.Threading.ThreadAbortException' in mscorlib.dll
[4] ADD: count = 2
[3] Loop: ThreadAbortException aborted.
Exception thrown: 'System.Threading.ThreadAbortException' in testThreadForm.exe
[4] Add: END.
[3] Loop: END.
[1] Abort: END.
The thread 0x6578 has exited with code 0 (0x0).
[4] _add: END
The thread 0x2508 has exited with code 0 (0x0).[1] Start: BEGIN.
[1] Start: END.
[5] Loop: BEGIN.
[6] _add: BEGIN
[6] Add: BEGIN.
[1] Interrupt: BEGIN.
[1] Interrupt: END.
Exception thrown: 'System.Threading.ThreadInterruptedException' in mscorlib.dll
[5] Loop: ThreadInterruptedException awoken.
[6] ADD: count = 4
[6] Add: END.
[6] _add: END
The thread 0x5fc has exited with code 0 (0x0).
[5] Loop: END.
The thread 0x4994 has exited with code 0 (0x0).

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/867613.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware ESXi 8.0U3c macOS Unlocker OEM BIOS Huawei (华为) 定制版

VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS Huawei (华为) 定制版VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS Huawei (华为) 定制版 ESXi 8.0U3c 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Hitachi (日立)、Fujitsu (富士…

【Go编程】流程控制

一、流程控制的作用: 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。 二、控制语句的分类: 控制语句分为三类:顺序、选择和循环。 “顺序结构”代表“先执行a,再执行b”的逻辑。 “条件判断结构”代表“如果…,则…”的…

在CDN上搭建支持反向代理的C2服务器(下)

免责声明: 本文技术只做研究之用,禁止用来从事非法用途,如有使用文章中的技术从事非法活动,一切后果由使用者自负,与作者无关。一、摘要 在上一篇文章中, 完成了Microsoft Azure 上的环境准备工作, 已经成功安装并配置了用于 Nginx 反向代理的虚拟机(VM)和用于 Cobalt Strike…

在CDN上搭建支持反向代理的C2服务器(上)

免责声明: 本文技术只做研究之用,禁止用来从事非法用途,如有使用文章中的技术从事非法活动,一切后果由使用者自负,与作者无关。一、摘要 在本文中,将探讨在微软Azure的CDN网络中使用C2域名和Nginx作为反向代理来构建一个红队基础设施。内容包括:C2域的选择和DNS配置、Cobalt St…

换个 AI 写

被遗忘,无法参与,无法长时间停课,对学校或教练组心存疑虑。每月的考试成绩。为了奥运会,并花费了无法停课的时间,以换取比赛课程的月度考试成绩。他们可以通过宣传来间接提高成绩。在未来的职业发展中,她取得了优异的成绩。缺乏时间,对江平在奥运会上取得优异成绩的怀疑…

从Resource中加载shellcode

以下文章来源于Relay学安全 ,作者FireGhost 前言 在开发malware过程中通常有两种加载shellcode方式: 1.把shellcode直接以硬编码的方式写入代码中 2.采用分离加载的方式 制作一个shellcode loader 从本地读取shellcode到内存中进行运行。 本文先讲解第一种方式,这个方式有一…

gRPC:第二代rpc服务

背景 在如今云原生技术的大环境下,rpc服务作为最重要的互联网技术,蓬勃发展,诞生了许多知名基于rpc协议的框架,其中就有本文的主角gRPC技术。一款高性能、开源的通用rpc框架 作者作为一名在JD实习的Cpper,经过一段时间的学习和实践,发现了C++与Java之间的种种不同,这也让…

Tensorflow2.0自定义层

Tensorflow2.0自定义层 tensorflow2.0建议使用tf.keras作为构建神经网络的高级API。 也就是说,大多数TensorFlow API都可用于eager执行模式。 from __future__ import absolute_import, division, print_function, unicode_literals !pip install -q tensorflow==2.0.0-alpha0…

推荐4本书《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》、《AI芯片开发核心技术详解》

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

arcpy环境搭建

背景 在ArcMap和ArcGIS Pro中,都可以使用arcpy,但是代码都要在相应环境中运行才行。 环境选择 1.在软件安装目录中运行arcpy 对于ArcMap中,可以直接在以下目录中运行arcpy代码: C:\Python27\ArcGIS10.4 对于ArcGIS Pro,可以在以下目录运行arcpy代码: C:\Program Files\Ar…

arcpy搭建环境

背景 在ArcMap和ArcGIS Pro中,都可以使用arcpy,但是代码都要在相应环境中运行才行。 环境选择 1.在软件安装目录中运行python 对于ArcMap中,可以直接在以下目录中运行arcpy代码: C:\Python27\ArcGIS10.4 对于ArcGIS Pro,可以在以下目录运行arcpy代码: C:\Program Files\A…

20250110-FortuneWheel 攻击事件:竟然不设滑点,那就体验一下 Force Investment 吧

背景信息 攻击交易:https://app.blocksec.com/explorer/tx/bsc/0xd6ba15ecf3df9aaae37450df8f79233267af41535793ee1f69c565b50e28f7da 漏洞合约:https://vscode.blockscan.com/56/0xc86A50d30c2da607DE91375f363DeDFb3086b9D4 FortuneWheel 合约实现了幸运轮盘竞猜功能,合约…