【C#】知识点实践序列之Lock的输出多线程信息

大家好,我是全栈小5,欢迎来到《小5讲堂之知识点实践序列》文章。
2024年第2篇文章,此篇文章是C#知识点实践序列之Lock知识点,博主能力有限,理解水平有限,若有不对之处望指正!
本篇在Lock锁定代码块输出多线程信息,用于判断是否是同一个线程还是不同线程。

在这里插入图片描述

目录

  • 前言
  • 实践场景
    • 线程
    • 效果
    • 代码
  • 疑问解答
    • 线程调度

在这里插入图片描述

前言

上篇文章已经回顾基本概念,并验证了Lock锁定代码块多线程访问效果。

实践场景

同样是执行三个方法,三个Task异步方法调用同一个方法。

线程

在 C# 中,线程是用于执行代码的基本执行单元。线程可以让程序在多个任务之间切换执行,以实现并发和并行处理。
线程基本信息,线程ID、线程名称、线程状态、是否为后台线程、是否为线程池线程。

// 获取当前线程信息
Thread currentThread = Thread.CurrentThread;// 输出线程信息
Console.WriteLine("线程 ID: {0}", currentThread.ManagedThreadId);
Console.WriteLine("线程名称: {0}", currentThread.Name);
Console.WriteLine("线程状态: {0}", currentThread.ThreadState);
Console.WriteLine("是否为后台线程: {0}", currentThread.IsBackground);
Console.WriteLine("是否为线程池线程: {0}", currentThread.IsThreadPoolThread);Console.ReadLine();

效果

从下面可以知道,如果在短时间内操作点击完按钮用户a、用户b、用户c,那么它的线程ID是不同的。
如果是逐个点击,那么它的线程ID又是一样的。

  • 快速点
    在这里插入图片描述
  • 逐个点
    在这里插入图片描述

代码

namespace XxxData
{public partial class Form1 : Form{public Form1(){InitializeComponent();CheckForIllegalCrossThreadCalls = false;}private void Form1_Load(object sender, EventArgs e){}private int visitorCount = 0;private void TargetData(string user){txtInfo.AppendText($"{user}{DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss")}\r\n");lock (this){Thread.Sleep(3 * 1000);// 获取和输出当前线程信息Thread currentThread = Thread.CurrentThread;txtInfo.AppendText($"线程 ID: {currentThread.ManagedThreadId},");txtInfo.AppendText($"线程名称: {currentThread.Name},");txtInfo.AppendText($"线程状态: {currentThread.ThreadState},");txtInfo.AppendText($"是否为后台线程: {currentThread.IsBackground},");txtInfo.AppendText($"是否为线程池线程: {currentThread.IsThreadPoolThread}\r\n");visitorCount += 1;lbVisitorCount.Text = $"访问用户数:{visitorCount}";txtInfo.AppendText($"{user}执行完毕,{DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss")}\r\n\r\n");}}private void btnA_Click(object sender, EventArgs e){Task.Run(() =>{TargetData("用户a");});}private void btnB_Click(object sender, EventArgs e){Task.Run(() =>{TargetData("用户b");});}private void btnC_Click(object sender, EventArgs e){Task.Run(() =>{TargetData("用户c");});}}
}

疑问解答

C# 为什么不同Task发起调用的到同一个Lock区域的线程ID是一样的,有些不同线程ID又不同

线程调度

在 C# 中,多线程程序中的线程调度是由操作系统来处理的,所以无法对线程的调度行为进行精确控制。这就导致了在多个 Task 中进行 lock 调用时,无法保证每个 Task 所在的线程的执行先后顺序是固定不变的。

当多个 Task 同时竞争同一个锁时,可能会有多个线程同时尝试获取锁。当其中一个线程获得锁时,其他线程会被阻塞,直到获得锁的线程释放锁资源。在获得锁之前,这些阻塞的线程是处于等待状态,并且可以从操作系统的线程池中进行调度分配。

由于线程调度的不确定性,操作系统可能会在调度线程时将某个 Task 所在的线程与其他线程互相切换执行。这就导致了在不同的执行时间点上,同一个 Lock 区域中的线程 ID 可能是相同的,也可能是不同的。

要注意的是,线程 ID 并不是唯一标识一个线程的属性。线程 ID 只是代表线程的一个标识符,它可以在不同的时间点上被复用。所以,当多个 Task 同时竞争同一个锁时,虽然线程 ID 可能是不同的,但实际上代表不同 Task 所在线程的执行上下文和状态是不同的。

总结起来,无法确定不同 Task 中获取同一个锁的线程 ID 是否相同,这是由于多线程调度的不确定性所导致的。在编写多线程程序时,应该关注线程同步的正确性而不是具体的线程 ID

总结:温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

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

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

相关文章

P1019 [NOIP2000 提高组] 单词接龙

网址如下:P1019 [NOIP2000 提高组] 单词接龙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 很怪,不知道该说什么 我试了题目给的第一个测试点的输入,发现输出和测试点的一样,但是还是WA 不是很懂为什么 有没有大佬帮我看一下…

20231228在Firefly的AIO-3399J开发板的Android11使用Firefly的DTS配置单前后摄像头ov13850

20231228在Firefly的AIO-3399J开发板的Android11使用Firefly的DTS配置单前后摄像头ov13850 2023/12/28 19:20 缘起,突然发现只能打开前置的ov13850,或者后置的ov13850。 但是不能切换! 【SDK:rk3399-android-11-r20211216.tar.xz】…

Java-replaceAll()同时替换多个字符

今天复现了raplaceAll()的用法,但是通常都是对一种字符进行替换,我就在想有没有操作可以一次性替换多个不同的字符,百度一搜,果然有。具体情况如下 首先是替换字的 String str1 "小明,小…

Vue - 多行文本“展开、收起”功能

TextClamp 使用 js 实现文本展开、收起,并非纯 CSS 实现。 Props: fontSize:Number,默认:14lines:Number,默认:1lineHeight:Number,默认:20 F…

双碳管理系统任务需求分析(第10套)

需求规格说明书 一、引言 (一)项目背景 编写本需求规格说明书的目的是为了详细呈现碳足迹产品需求和系统的功能描述,以进一步定制应用软件系统开发的细节问题,便于与项目开发协调工作。本文档面向的读者主要是项目委托单位的管…

vivado 管理宏

管理宏 宏存储为XDC约束。根据定义,它们是Tcl命令。这允许要在XDC约束文件和Tcl脚本中使用并交互使用的宏。宏是使用write_xdc命令编写的。使用read_xdc读取宏命令-cell选项可用于将作用域限制为特定的单元格。-cell选项特别适用于将一个宏的相对放置应用到不同层次…

4.快速实现增删改查,模糊查询功能

打开springboot项目,在com.example下建包common,在common下新建Result.java 4.1封装统一的返回数据结构 1.在Result.java中编写如下代码: private static final String *SUCCESS*"0"; private static final String *ERROR*"-1"; p…

ROS学习笔记(8)进一步深入了解ROS第二步

0.前提 在上一讲中我提到过该系列是基于宾夕法尼亚大学工程学院的ROS公开课,系列文章将来源于公开课中的课后习题。该系列可以很好的帮助大家更加深入的了解ROS的一些概念。(有效面对HR的提问。) 1. (C)What is a nodehandle object? Can we…

项目经验简单总结

引擎 unity 2020 语言 C# lua python(用于工具链) java (用于SDK对接) js(PC WEB SDK对接) 编辑器 VS VSCODE IDEA eclipse 项目开发模块规划分 主项目工程,UI资源项目工程,模型场景资源项目工程 主项目工程:所有的…

Excel模板填充:从minio上获取模板使用easyExcel填充

最近工作中有个excel导出的功能,要求导出的模板和客户提供的模板一致,而客户提供的模板有着复杂的表头和独特列表风格,像以往使用poi去画是非常耗时间的,比如需要考虑字体大小,单元格合并,单元格的格式等问…

vue-打包

打包的作用 说明:vue脚手架只是开发过程中,协助开发的工具,当真正开发完了>脚手架不参与上线 打包的作用: 1)将多个文件压缩合并成一个文件 2)语法降级 3)less sass ts语法解析 打包后…

liunx操作系统基础及进阶

一、基础入门 1、Linux系统简介 什么是Liunx? Linux在设计之初,是一个基于POSIX的多用户、多任务并且支持多线程和多CPU的操作系统,它是由世界各地成千上万的程序员设计和开发实现; 在当今社会,Linux 系统主要被应…

【智慧零售】东胜物联蓝牙网关硬件解决方案,促进零售门店数字化管理

依托物联网(IoT)、大数据、人工智能(AI)等快速发展,数字化和智能化已成为零售企业的核心竞争力。更多的企业通过引入人工智能、大数据等先进技术手段,提高门店运营效率和服务质量。 某连锁咖啡企业牢牢抓住…

[嵌入式C][入门篇] 快速掌握基础(9个语句)

开发环境: 网页版:跳转本地开发(Vscode):跳转 文章目录 一、基础语法(1)if (如果)示例1: 普通使用 if示例2: 带否则 else示例3: 否则如果 else if (2)switch case (选择)规则示例1: &#xff0…

谷歌浏览器 模拟定位

注意事项: 如果要清除位置信息,需将Geolocation修改为No override模拟定位之后需要刷新页面,网页才会生效如果模拟定位,一段时间没有操作,就会清空模拟定位,类似于No override

ubuntu远程桌面连接之novnc

一、前言 该操作是为了实现vnc桌面连接为url连接方式,且在浏览器中可以对ubuntu进行操作。在使用novnc进行操作前,需要先安装vnc才可。ubuntu下如何安装vnc,可看博主前面写的一篇文,ubuntu远程桌面连接之vnc-CSDN博客,…

案例074:基于微信小程序的儿童预防接种预约管理系统

文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder …

物流实时数仓:数仓搭建(DWS)一

系列文章目录 物流实时数仓:采集通道搭建 物流实时数仓:数仓搭建 物流实时数仓:数仓搭建(DIM) 物流实时数仓:数仓搭建(DWD)一 物流实时数仓:数仓搭建(DWD&am…

22款奔驰GLE450升级香氛负离子 车载香薰

相信大家都知道,奔驰自从研发出香氛负离子系统后,一直都受广大奔驰车主的追捧,香氛负离子不仅可以散发出清香淡雅的香气外,还可以对车内的空气进行过滤,使车内的有害气味通过负离子进行过滤,达到车内保持清…

神经网络:经典模型热门模型

在这里插入代码片【一】目标检测中IOU的相关概念与计算 IoU(Intersection over Union)即交并比,是目标检测任务中一个重要的模块,其是GT bbox与pred bbox交集的面积 / 二者并集的面积。 下面我们用坐标(top&#xff0…