当前位置: 首页 > news >正文

.Net多线程Threading相关详解

一、线程不安全例子

计数

const int total = 100_000;int count = 0;var thread1 = new Thread(Increment);
var thread2 = new Thread(Increment);thread1.Start();
thread2.Start();thread1.Join();
thread2.Join();Console.WriteLine($"Count: {count}");void Increment()
{for (int i = 0; i < total; i++)count++;
}

操作队列

var queue = new Queue<int>();var producer = new Thread(Producer);
var consumer1 = new Thread(Consumer);
var consumer2 = new Thread(Consumer);producer.Start();
consumer1.Start();
consumer2.Start();producer.Join();
Thread.Sleep(100); // Wait for consumers to finishconsumer1.Interrupt();
consumer2.Interrupt();
consumer1.Join();
consumer2.Join();void Producer()
{for (int i = 0; i < 20; i++){Thread.Sleep(20);queue.Enqueue(i);}
}void Consumer()
{try{while (true){if (queue.TryDequeue(out var res))Console.WriteLine(res);Thread.Sleep(1);}}catch (ThreadInterruptedException){Console.WriteLine("Thread interrupted.");}
}

二、Parallel与PLINQ

var inputs = Enumerable.Range(1,20).ToArray();int HeavyJob(int input)
{Thread.Sleep(300);return input;
}// Sequential
var forOutputs = new int[inputs.Length];
for (int i = 0; i < inputs.Length; i++)
{forOutputs[i] = HeavyJob(inputs[i]);
}// Parallel
var parallelOutputs = new int[inputs.Length];
Parallel.For(0, inputs.Length, i =>
{parallelOutputs[i] = HeavyJob(inputs[i]);
});// PLINQ
var plinqOutputs = inputs.AsParallel().Select(HeavyJob).ToArray();

三、PLINQ 与信号量

using System.Diagnostics;var inputs = Enumerable.Range(1,20).ToArray();
var semaphore = new Semaphore(3, 3);int HeavyJob(int input)
{semaphore.WaitOne();Thread.Sleep(300);semaphore.Release();return input;
}var sw = Stopwatch.StartNew();
var plinqOutputs = inputs.AsParallel().Select(HeavyJob).ToArray();
sw.Stop();
Console.WriteLine($"Elapsed time: {sw.ElapsedMilliseconds}ms");

四、线程终止

//线程终止
var thread = new Thread(() =>
{try{for (int i = 0; i < 10; i++){Thread.Sleep(1000);Console.WriteLine("Sub thread: " + i);}}catch (ThreadInterruptedException){Console.WriteLine("Thread interrupted");}
});thread.Start();
Thread.Sleep(3500);
thread.Interrupt();
thread.Join();
Console.WriteLine("Done");

相关文章:

  • 数据库大作业——音乐平台数据库管理系统
  • 爬虫的法律风险是什么?以及合法使用爬虫技术的建议。
  • 基于深度学习的光流预测
  • Elasticsearch搜索引擎(高级篇)
  • k8s快速上手实操
  • llama-factory微调chatglm3
  • MySQL数据库的列类型
  • 如何理解shell命令 cd $(dirname $0)
  • matlab 路面点云标线提取
  • 2024年应用科学、航天航空与核科学国际学术会议(ICASANS 2024)
  • 睿治数据治理平台焕新升级,推出全新建模与调度平台
  • 【面试八股总结】Redis数据结构及底层实现
  • 小抄 20240612
  • 应急响应场景及排查思路
  • Linux的内核参数kernel.shmmax、kernel.shmall 和 kernel.shmmni
  • 时间复杂度分析经典问题——最大子序列和
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【个人向】《HTTP图解》阅后小结
  • 【技术性】Search知识
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • canvas 高仿 Apple Watch 表盘
  • HTML5新特性总结
  • Java 内存分配及垃圾回收机制初探
  • Java小白进阶笔记(3)-初级面向对象
  • Joomla 2.x, 3.x useful code cheatsheet
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MySQL QA
  • Python 反序列化安全问题(二)
  • vue总结
  • 构造函数(constructor)与原型链(prototype)关系
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 深入 Nginx 之配置篇
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 学习Vue.js的五个小例子
  • 应用生命周期终极 DevOps 工具包
  • 原生JS动态加载JS、CSS文件及代码脚本
  • ionic异常记录
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • %check_box% in rails :coditions={:has_many , :through}
  • (2)leetcode 234.回文链表 141.环形链表
  • (ZT)出版业改革:该死的死,该生的生
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (南京观海微电子)——示波器使用介绍
  • (三)Honghu Cloud云架构一定时调度平台
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (算法)Game
  • (一)RocketMQ初步认识
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (自用)交互协议设计——protobuf序列化
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验