随笔分类 -  .Net / C# 多线程

摘要:注:基元指可以再代码中使用的最简单的构造. 线程基元构造分为两种,用户模式和内核模式. 用户模式分析: 优点: 1、速度比内核模式块,使用特殊cpu指令来协调线程,协调实在硬件级别发生的. 2、在此构造上的线程池线程一旦发生阻塞,并不会创建的新的线程,因为它不会认为自己发生阻塞.。 3、cpu指令只 阅读全文
posted @ 2021-11-08 17:33 郑小超 阅读(144) 评论(0) 推荐(0) 编辑
摘要:此文例子有误,有时间会更正 前文介绍了基元线程同步构造,主要说了线程协调在用户模式和内核模式下的优缺点,本文将在此基础上介绍实际的应用案列. 1、原子性 CLR保证大部分值类型和引用类型的读写是原子性的,如下代码: private int param = 0; /// <summary> /// 线 阅读全文
posted @ 2021-11-08 17:09 郑小超 阅读(110) 评论(0) 推荐(0) 编辑
摘要:1、简介 .NET 3.5 开始 ReaderWriterLockSlim登上舞台,ReaderWriterLockSlim 可以看做是 ReaderWriterLock 的升级版。 由于 ReaderWriterLockSlim 默认不支持递归调用、所以在某种意义上来说更不容易造成死锁。Reade 阅读全文
posted @ 2019-03-28 23:37 郑小超 阅读(4248) 评论(0) 推荐(1) 编辑
摘要:1、简介 本文主要演示日常开发中利用多线程写入文件存在的问题,以及解决方案,本文使用最常用的日志案例! 2、使用File.AppendAllText写入日志 这是种常规的做法,通过File定位到日志文件所在位置,然后写入相应的日志内容,代码如下: 报错了,原因,Windows不允许多个线程同时操作同 阅读全文
posted @ 2019-03-28 20:02 郑小超 阅读(1847) 评论(1) 推荐(2) 编辑
摘要:1、简介 关于Windows的异步I/O操作,只要解决的是同步I/O操作的线程利用率问题,通过异步I/O Api来提升线程的利用率,提升系统的吞吐能力,将各种I/O操作交给线程池然后交由硬件设备执行,期间完全不占用线程和CPU资源. 2、同步I/O存在的问题 当编写同步I/O操作时,在硬件设备执行I 阅读全文
posted @ 2019-03-28 00:09 郑小超 阅读(1287) 评论(0) 推荐(1) 编辑
摘要:1、简介 相信写过定时任务的小伙伴都知道这个类,非常的轻量级,而且FCL中大量的类使用了这个方法,比如CancellationTokenSource的CancelAfter就是用Timer去做的. 当然FCL中大量的使用了Timer,说明MS对Timer类是信任的.下面就开始介绍这个类的用法.简介很 阅读全文
posted @ 2018-12-14 01:30 郑小超 阅读(15388) 评论(0) 推荐(5) 编辑
摘要:1、简介 关于并行Linq,Ms官方叫做并行语言集成(PLINQ)查询,其实本质就是Linq的多线程版本,常规的Linq是单线程的,也就是同步的过程处理完所有的查询.如果你的Linq查询足够简单,而且耗时短,那么建议你使用Linq,但是如果你的查询比较耗时,而且很复杂,且不涉及多线程争用问题,那么可 阅读全文
posted @ 2018-12-09 17:26 郑小超 阅读(3103) 评论(0) 推荐(0) 编辑
摘要:网上关于List的线程安全问题将的很少,所以自己实验了一把,发现确实是线程不安全的.所以当你在进行多线程编程中使用了共享的List集合,必须对其进行线程安全处理. List的Add方法是线程不安全的,List的源码中的Add方法,使用了每次当当前的元素达到上限,通过创建一个新的数组实例,并给长度翻倍 阅读全文
posted @ 2018-12-09 17:18 郑小超 阅读(30359) 评论(0) 推荐(4) 编辑
摘要:1、简介 关于Parallel不想说太多,因为它是Task的语法糖,至少我是这么理解的,官方文档也是这么说的,它本身就是基本Task的.假设我们有一个集合,不管是什么集合,我们要遍历它,首先想到的是For(如何涉及到修改或者读可以用for)或者Foreach(如果单纯的读),但是它两是同步的去操作集 阅读全文
posted @ 2018-12-09 02:55 郑小超 阅读(2933) 评论(0) 推荐(0) 编辑
摘要:1、知识回顾,简要概述 前面两篇关于Task的随笔,C# 多线程五之Task(任务)一 和 C# 多线程六之Task(任务)二,介绍了关于Task的一些基本的用法,以及一些使用的要点,如果都看懂了,本文将介绍另一个Task的特殊用法,前面介绍了,如何通过一个父任务创建多个子任务,且这些子任务都必须要 阅读全文
posted @ 2018-12-08 18:38 郑小超 阅读(2638) 评论(0) 推荐(0) 编辑
摘要:前面介绍了Task的由来,以及简单的使用,包括开启任务,处理任务的超时、异常、取消、以及如果获取任务的返回值,在回去返回值之后,立即唤起新的线程处理返回值、且如果前面的任务发生异常,唤起任务如果有效的处理异常等关于Task的知识。所以本文将介绍Task更多的用法和特性. 一、如果通过一个任务创建多个 阅读全文
posted @ 2018-12-02 00:00 郑小超 阅读(2367) 评论(2) 推荐(0) 编辑
摘要:1、简介 为什么MS要推出Task,而不推Thread和ThreadPool,以下是我的见解: (1)、Thread的Api并不靠谱,甚至MS自己都不推荐,原因,它将整个Thread类都不开放给Windows Sotre程序,且它的Api过于强大,如果在程序中过度使用,维护的成本太高,想想代码中充斥 阅读全文
posted @ 2018-11-20 00:41 郑小超 阅读(12657) 评论(3) 推荐(1) 编辑
摘要:1、简介 虽然ThreadPool、Thread能开启子线程将一些任务交给子线程去承担,但是很多时候,因为某种原因,比如子线程发生异常、或者子线程的业务逻辑不符合我们的预期,那么这个时候我们必须关闭它,而不是让它继续执行,消耗资源.让CPU不在把时间和资源花在没有意义的代码上. 2、主线程取消所有子 阅读全文
posted @ 2018-11-19 00:29 郑小超 阅读(3518) 评论(0) 推荐(0) 编辑
摘要:一、CLR线程池 1、进程和CLR的关系一个进程可以只包含一个CLR,也可以包含多个CLR2、CLR和AppDomain的关系一个CLR可以包含多个AppDomain3、CLR和线程池的关系一个CLR只包含一个线程池所以得出一个CLR下的多个AppDomain共享一个线程池和一个进程下的多个CLR拥 阅读全文
posted @ 2018-11-17 13:48 郑小超 阅读(698) 评论(0) 推荐(0) 编辑
摘要:一、关于前台线程和后台线程 1、简介 CLR中线程分为两种类型,一种是前台线程、另一种是后台线程. 前台线程:应用程序的主线程、Thread构造的线程都默认为前台线程 后台线程:线程池线程都为后台线程 2、区别 前台线程:前台线程一般执行重要性很高的任务,至于什么是重要性很高,这个需要结合业务综合考 阅读全文
posted @ 2018-11-14 00:34 郑小超 阅读(770) 评论(0) 推荐(0) 编辑
摘要:一、Windows线程的由来 关于操作系统的一些知识 (1)、单个"工作线程"的问题 早期的Windows没有线程的概念,整个系统只有一个"工作线程",上面同时跑着操作系统代码和应用程序代码.这种方式最大的缺点就是,一个应用程序运行时会霸占整台机器(应为只有一个工作线程),且当它发生死循环时,会造成 阅读全文
posted @ 2018-11-05 15:19 郑小超 阅读(752) 评论(1) 推荐(1) 编辑