随笔分类 -  10-多线程

1
摘要:在面对 生产者-消费者 的场景下, netcore 提供了一个新的命名空间 System.Threading.Channels 来帮助我们更高效的处理此类问题,有了这个 Channels 存在, 生产者 和 消费者 可以各自处理自己的任务而不相互干扰,有利于两方的并发处理,这篇文章我们就来讨论下如何 阅读全文
posted @ 2023-12-19 15:01 .Neterr 阅读(322) 评论(0) 推荐(0) 编辑
摘要:using System.Collections.Concurrent; using System.Diagnostics; { int threadCount = 20; List<Task> tasks = new List<Task>(); ConcurrentQueue<int> queue 阅读全文
posted @ 2023-10-08 14:45 .Neterr 阅读(69) 评论(0) 推荐(0) 编辑
摘要:在C#中,可以使用CancellationToken来优雅地关闭线程。CancellationToken是一个结构体,用于向线程发送信号以请求线程停止运行。以下是一个使用CancellationToken的示例代码: ``` using System; using System.Threading; 阅读全文
posted @ 2023-06-27 16:16 .Neterr 阅读(200) 评论(0) 推荐(0) 编辑
摘要:List是线程不安全的,通过一个数组存储数据,当容量达到数组上限时,创建一个新数组,因此存在线程安全问题 SafeList是在做增删改操作时返回一个新的ReadonlyList,所以不存在线程安全问题 /// <summary> /// SafeList is mutable, but it use 阅读全文
posted @ 2021-02-19 19:24 .Neterr 阅读(1772) 评论(0) 推荐(0) 编辑
摘要:同步,异步 和 阻塞,非阻塞之间的区别? 同步,异步,是描述被调用方的。阻塞,非阻塞,是描述调用方的。 同步不一定阻塞,异步也不一定非阻塞。没有必然关系。 举个简单的例子: 1 老张把水壶放到火上,一直在水壶旁等着水开。(同步阻塞) 2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。( 阅读全文
posted @ 2021-02-07 16:43 .Neterr 阅读(124) 评论(0) 推荐(0) 编辑
摘要:AsnyncLocal与ThreadLocal都是存储线程上下文的变量,但是,在实际使用过程中两者又有区别主要的表现在: AsyncLocal变量可以在父子线程中传递,创建子线程时父线程会将自己的AsyncLocal类型的上下文变量赋值到子线程中,但是,当子线程改变线程上下文中AsnycLocal变 阅读全文
posted @ 2020-10-10 16:18 .Neterr 阅读(451) 评论(0) 推荐(0) 编辑
摘要:简介 Async/Await在.Net Core中真的是无处不在,到处都是异步操作,那为什么要用?有什么作用?别人说能提升性能? async/await可以让我们写出和同步代码一样简洁的异步代码 这里从理论,实践,原理一个个解开这些疑问。 语法 async关键字必须在返回类型之前,async修饰的方 阅读全文
posted @ 2020-09-08 10:48 .Neterr 阅读(339) 评论(0) 推荐(0) 编辑
摘要:乐观锁与悲观锁: 众所周知锁有两种:乐观锁与悲观锁。独占锁是一种悲观锁,而 Lock 就是一种独占锁,Lock 会导致其它所有未持有锁的线程阻塞,而等待持有锁的线程释放锁。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止,这个过程叫自旋。而乐观锁用到的 阅读全文
posted @ 2020-07-19 16:22 .Neterr 阅读(620) 评论(0) 推荐(0) 编辑
摘要:互斥锁 一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩写 Mutex)。实现了互斥锁对象有:Monitor,Mutex,SpinLock 信号量 还有些房间,可以同时容纳n个人,比如 阅读全文
posted @ 2020-06-14 22:39 .Neterr 阅读(383) 评论(0) 推荐(1) 编辑
摘要:介绍 读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁。在C#中,推荐使用ReaderWriterLockSlim类来完成读写锁的功能。 某些场合下,对一个对象的读取次数远远大于修改次数,如果只是简单的用lock方式加锁,则会影响读取的效率。而如 阅读全文
posted @ 2020-05-31 16:55 .Neterr 阅读(370) 评论(0) 推荐(0) 编辑
摘要:自旋锁(spinlock) 是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。 什么情况下使用自旋锁 自旋锁非常有助于避免阻塞,但是如果预期有大量阻塞,由于旋转过多,您可能不应该使用自旋锁。当锁是细粒度的并且数 阅读全文
posted @ 2020-05-31 10:49 .Neterr 阅读(375) 评论(0) 推荐(0) 编辑
摘要:1 阅读全文
posted @ 2020-05-28 23:30 .Neterr 阅读(1015) 评论(1) 推荐(0) 编辑
摘要:volatile特点: 保证可见性,可见性是指当一个线程修改了共享变量的值,其他线程可以立即得知 保证有序性? 不保证原子性(需要使用悲观锁or乐观锁) 线程栈: 每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存 阅读全文
posted @ 2020-05-25 16:32 .Neterr 阅读(185) 评论(1) 推荐(0) 编辑
摘要:实现线程的本地存储,也就是线程内可见。这些数据都是存放在线程环境块中,是线程的空间开销 有以下几种方式 线程数据槽 已过时,建议使用ThreadStaticAttribute static void Main(string[] args) { var slot = Thread.AllocateDa 阅读全文
posted @ 2020-05-25 15:39 .Neterr 阅读(483) 评论(1) 推荐(0) 编辑
摘要:简介 Parallel类是对线程的抽象,提供数据与任务的并行性。 在同步状态下简化Task的使用,也就是使用For、Foreach、Invoke方法时,调用者线程是阻塞的。 并行方法 Parallel对象提供了3个静态方法来实现 数据和任务的并行 Parallel.For Parallel.ForE 阅读全文
posted @ 2020-05-23 16:52 .Neterr 阅读(547) 评论(0) 推荐(0) 编辑

1