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

news2024/11/30 8:44:14

大家好,我是全栈小5,欢迎来到《小5讲堂之知识点实践序列》文章。
2023年第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.coloradmin.cn/o/1348287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【力扣题解】P700-二叉搜索树中的搜索-Java题解

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P700-二叉搜索树中的搜索-Java题解🌏题目描述💡题解&#x1f…

D45D46|动态规划之子序列问题

300.最长递增子序列: 初始思路: 动态规划五部曲: 1)dp数组的定义,dp[i]表述数组第i个元素大于前面几个值; 2)dp数组的迭代,min nums[x]表示递增数组中的最后一个值,如…

Linux 安装 mysql【使用yum源进行安装】

配置yum 源 首先,去到mysql网站,找到它的rpm的资源包 “mysql80-community-release-el9-5.noarch.rpm” 我们将其下载下来,然后配置yum源(下面两种方式二选一即可) ① 使用xftp传输,然后配置yum源 rpm …

【数据结构】栈和队列(队列的基本操作和基础知识)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​ 目录 前言 队列 队列的概念和结构 队列的…

王道考研计算机网络——应用层

如何为用户提供服务? CS/P2P 提高域名解析的速度:local name server高速缓存:直接地址映射/低级的域名服务器的地址 本机也有告诉缓存:本机开机的时候从本地域名服务器当中下载域名和地址的对应数据库,放到本地的高…

FDM3D打印系列——RX-78-2高达胸像打印

https://v.youku.com/v_show/id_XNjI4OTQ2NjkyNA.html   大家好,我是阿赵。   2024年的第一篇博客,做一个3D打印作品,RX-78-2高达胸像打印。 成年男人是很少收得到礼物的,所以礼物都要自己准备。这个模型,就算是我…

Javaweb之Mybatis入门程序的详细解析

1.2 入门程序实现 1.2.1 准备工作 1.2.1.1 创建springboot工程 创建springboot工程&#xff0c;并导入 mybatis的起步依赖、mysql的驱动包。 项目工程创建完成后&#xff0c;自动在pom.xml文件中&#xff0c;导入Mybatis依赖和MySQL驱动依赖 <!-- 仅供参考&#xff1a;只…

数据库——建立ER模型及关系模型转换

​ 【实验内容及要求】 使用画图工具或MySQL Workbench等建模工具设计出相应的ER图&#xff0c;将局部ER图合并为一个整体ER模型&#xff0c;在ER模型中填加多样性约束&#xff0c;建立显示主键的ER模型&#xff0c;标识实体的属性&#xff0c;确认主键、外键。将上述ER图转化…

基于 LightGBM 的系统访问风险识别

基于 LightGBM 的系统访问风险识别 文章目录 基于 LightGBM 的系统访问风险识别一、课题来源二、任务描述三、课题背景四、数据获取分析及说明&#xff08;1&#xff09;登录https://www.datafountain.cn并获取相关数据&#xff08;2&#xff09;数据集文件说明&#xff08;3&a…

pycharm python环境安装

目录 1.Python安装 2.PyQt5介绍 3.安装pyuic 4.启动designer.exe 5.pyinstaller(打包发布程序) 6.指定源安装 7.PyQt5-tools安装失败处理 8.控件介绍 9.错误记录 1.NameError: name reload is not defined 10.开发记录 重写报文输出和文件 ​编辑 1.Python安装 点…

linux用户态与内核态通过字符设备交互

linux用户态与内核态通过字符设备交互 简述 Linux设备分为三类&#xff0c;字符设备、块设备、网络接口设备。字符设备只能一个字节一个字节读取&#xff0c;常见外设基本都是字符设备。块设备一般用于存储设备&#xff0c;一块一块的读取。网络设备&#xff0c;Linux将对网络…

Django Cookie和Session使用(十一)

一、Cookie Cookie具体指一小段信息&#xff0c;它是服务器发送出来存储在浏览器上的一组键值对&#xff0c;下次访问服务器时浏览器会自动携带这些键值对&#xff0c;以便服务器提取有用信息。 Cookie的特性 1、服务器让浏览器进行设置的 2、保存在浏览器本地&#xff0c;…

2024的十大技术趋势预测

&#x1f4a1; 大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 2024年&#xff0c;科技圈还会有什么样的新鲜新发生&#xff1f;techradar的记者Lance Ulanoff预测了科技圈的2024十大趋势&#xff0c;包括AI、…

flutter学习-day20-使用SafeArea组件处理各机型的安全距离

文章目录 1. 介绍2. 解析3. 示例和效果图4. 特殊情况 1. 介绍 安全区域&#xff0c;指的是移动端设备的可视窗口范围。处于安全区域的内容不受圆角、刘海屏、iPhone 小黑条、状态栏等的影响&#xff0c;也就是说&#xff0c;我们要做好适配&#xff0c;必须保证页面可视、可操…

FA组件详解

1、了解FA核心组件以及功能 &#xff08;1&#xff09;TC&#xff08;Thin Client&#xff1a;瘦终端&#xff09;&#xff1a;就是类似于机顶盒的一个小盒子&#xff0c;里面有CPU、内存、USB、MIC、HDMI等接口&#xff0c;可以理解为小型电脑&#xff0c;但是它里面是没有操作…

硬件安全模块 (HSM)、硬件安全引擎 (HSE) 和安全硬件扩展 (SHE)的区别

术语 硬件安全模块 (HSM) &#xff1a;Hardware Security Modules硬件安全引擎 (HSE) &#xff1a;Hardware Security Engines安全硬件扩展 (SHE) &#xff1a; Secure Hardware Extensions 介绍 在汽车行业中&#xff0c;硬件安全模块 (HSM)、硬件安全引擎 (HSE) 和安全硬件…

【ESP-NOW with ESP32:从多个开发板接收数据(多对一)】

【ESP-NOW with ESP32&#xff1a;从多个开发板接收数据&#xff08;多对一&#xff09;】 1. 项目概况2. 先决条件2.1 环境配置2.2 所需零件 3. 获取接收板 MAC 地址4. ESP32 发送码 &#xff08;ESP-NOW&#xff09;4.1 代码的工作原理4.2 setup&#xff08;&#xff09;4.3 …

第6课 用window API捕获麦克风数据并加入队列备用

今天是2024年1月1日&#xff0c;新年的第一缕阳光已经普照大地&#xff0c;祝愿看到这篇文章的所有程序员或程序爱好者都能在新的一年里持之以恒&#xff0c;事业有成。 今天也是我加入CSDN的第4100天&#xff0c;但回过头看一看&#xff0c;这么长的时间也没有在CSDN写下几篇…

Windows 10 安装和开启VNCServer 服务

Windows 10 安装和开启VNCServer 服务 登录云服务器 使用本地RDP登录到配置VNCServer服务的Windows10系统的云服务器。 下载VNC Server安装包 打开官网下载VNCServer安装包 URL&#xff1a;https://www.realvnc.com/en/connect/download/vnc/windows/ 安装VNC Server 双击…

LVGL 在framebuffer设备上的移植

LVGL 在framebuffer设备上的移植 ItemDescDate2023-12-31Authorhongxi.zhuplatformNXP I.MX6ULLLCDSPI TFTLCD NV3030B 文章目录 LVGL 在framebuffer设备上的移植一、LVGL源码获取二、源码修改适配三、编译&运行补充 一、LVGL源码获取 新建lvgl_imx6ull文件夹&#xff0c…