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