threadpool

C# 并发编程

China☆狼群 提交于 2020-04-22 02:28:54
各位博客网的朋友大家好,我是石头,现在由我带来《 C#并行编程 》这门课程。 相信大家对并行编程都有一定的了解,比如多线程、异步等等。 本人通过学习一些书籍和一些大神的文章,再根据自身对并发编程的理解,整理了这个系列文章。 《C#并发编程》系列文章目录: 1. 并发编程相关概念 2. SynchronizationContext(同步上下文)综述 3. ExecutionContext(执行上下文)综述 4. ThreadPool(线程池)介绍 5. 异步编程基础 6. 数据流块基础 7. Rx基础 8. 互操作 9. 线程安全集 10. 取消任务 11. 线程同步 12. 任务调度 13. 实用技巧 14. 多线程共享变量和 AsyncLocal ## Release: 日期 更新 2020年2月2日 第一版系列文章完成 2020年2月16日 增加文章: 《ExecutionContext(执行上下文)综述》 、 《多线程共享变量和 AsyncLocal》 参考资料 : 《C#并发编程经典实例》 --- Stephen Cleary 《并行计算 - SynchronizationContext 综述》 --- Stephen Cleary 《The CLR's Thread Pool》 --- Jeffrey Richter 《ExecutionContext vs

同步异步多线程这三者关系,你能给面试官一个满意的回答吗?

非 Y 不嫁゛ 提交于 2020-04-21 20:59:22
前几天一位朋友去面试,面试官问了他同步,异步,多线程之间是什么关系,异步比同步高效在哪?多线程比单线程高效在哪?由于回答的不好,让我帮他捋一下,其实回答这个问题不难,难就难在只对别人说理论,而没有现杀的例子。 一:异步 1. 到底解放了谁? <1> 从基础的同步说起 要说解放了谁,一定得有几个参与者,举个例子:当你的主线程读取一个应用程序之外的资源时,它有可能是一个文件,又有可能是一个外部服务,当用同步方式读取外部服务时,首先主线程会从用户模式进入到内核模式,在内核模式中windows会将你的请求数据交给对应的网络驱动程序,继后会让这个线程进入休眠状态,当网络驱动程序和外部服务一阵痉挛之后,网络驱动程序会将获取到的结果交给当初休眠的线程,windows唤醒休眠线程继而执行后续的C#代码,画个简图理解一下,不一定全对。 这里就存在着一个非常大的问题,步骤4-步骤7之间,你的主线程一直都是休眠状态,比如在GUI编程中,有一个重要的原则就是解放你的UI线程(主线程),所以解决这个问题就迫在眉睫。 <2> 异步方式下的处理方案 说到这里,大家应该知道了异步方式就是为了解放主线程,又可以叫调用线程,没错,接下来看一下同样的场景在异步中如何处理的。 从图中可以看到,步骤三中将thread数据交给网络驱动程序之后,该thread就直接返回不管了,当后续网络驱动程序获取数据后

同步异步多线程这三者关系,你能给面试官一个满意的回答吗?

北战南征 提交于 2020-04-21 17:19:17
前几天一位朋友去面试,面试官问了他同步,异步,多线程之间是什么关系,异步比同步高效在哪?多线程比单线程高效在哪?由于回答的不好,让我帮他捋一下,其实回答这个问题不难,难就难在只对别人说理论,而没有现杀的例子。 一:异步 1. 到底解放了谁? <1> 从基础的同步说起 要说解放了谁,一定得有几个参与者,举个例子:当你的主线程读取一个应用程序之外的资源时,它有可能是一个文件,又有可能是一个外部服务,当用同步方式读取外部服务时,首先主线程会从用户模式进入到内核模式,在内核模式中windows会将你的请求数据交给对应的网络驱动程序,继后会让这个线程进入休眠状态,当网络驱动程序和外部服务一阵痉挛之后,网络驱动程序会将获取到的结果交给当初休眠的线程,windows唤醒休眠线程继而执行后续的C#代码,画个简图理解一下,不一定全对。 这里就存在着一个非常大的问题,步骤4-步骤7之间,你的主线程一直都是休眠状态,比如在GUI编程中,有一个重要的原则就是解放你的UI线程(主线程),所以解决这个问题就迫在眉睫。 <2> 异步方式下的处理方案 说到这里,大家应该知道了异步方式就是为了解放主线程,又可以叫调用线程,没错,接下来看一下同样的场景在异步中如何处理的。 从图中可以看到,步骤三中将thread数据交给网络驱动程序之后,该thread就直接返回不管了,当后续网络驱动程序获取数据后

C# 并发编程

纵饮孤独 提交于 2020-04-21 12:29:24
各位博客网的朋友大家好,我是石头,现在由我带来《 C#并行编程 》这门课程。 相信大家对并行编程都有一定的了解,比如多线程、异步等等。 本人通过学习一些书籍和一些大神的文章,再根据自身对并发编程的理解,整理了这个系列文章。 《C#并发编程》系列文章目录: 1. 并发编程相关概念 2. SynchronizationContext(同步上下文)综述 3. ExecutionContext(执行上下文)综述 4. ThreadPool(线程池)介绍 5. 异步编程基础 6. 数据流块基础 7. Rx基础 8. 互操作 9. 线程安全集 10. 取消任务 11. 线程同步 12. 任务调度 13. 实用技巧 14. 多线程共享变量和 AsyncLocal ## Release: 日期 更新 2020年2月2日 第一版系列文章完成 2020年2月16日 增加文章: 《ExecutionContext(执行上下文)综述》 、 《多线程共享变量和 AsyncLocal》 参考资料 : 《C#并发编程经典实例》 --- Stephen Cleary 《并行计算 - SynchronizationContext 综述》 --- Stephen Cleary 《The CLR's Thread Pool》 --- Jeffrey Richter 《ExecutionContext vs

串口数据处理分包处理

青春壹個敷衍的年華 提交于 2020-04-21 10:20:19
最近遇到一个需求,利用树莓派去采集一个串口设备的所有数据,设备会主动上报数据,但是呢这个设备是一个集合设备,会上报的报文头都不一样,比如灯亮度或者开关会上报21 12 ·········,风速会上报71 23 ······。等等10多种数据格式。 刚好net core 支持跨平台串口通信。所以记录如下,主要是数据处理这部分; 1. 收到的数据立马转移到深度缓存中,在开启线程处理数据 private List< byte > tempBuffer = new List< byte >(); // 深度缓存数据 private void SP_ReadData_DataReceived( object sender, SerialDataReceivedEventArgs e) { try { int count = sP_ReadData.BytesToRead; byte [] buf = new byte [count]; sP_ReadData.Read(buf, 0 , count); // 读取缓冲数据 tempBuffer.AddRange(buf); // 把数据放入深度缓存区域 // 提高数据处理速度 ThreadPool.QueueUserWorkItem( new WaitCallback(DealData), null ); } catch (Exception

线程安全问题(多方面考虑)

荒凉一梦 提交于 2020-04-21 04:24:45
概念 : 线程安全 就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全 就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。 什么时候考虑到线程安全 : 一个对象是否需要线程安全,取决于该对象是否被多线程访问。这指的是程序中访问对象的方式,而不是对象要实现的功能。要使得对象是线程安全的,要采用同步机制来协同对对象可变状态的访问。Java常用的同步机制是 Synchronized ,还包括 volatile 类型的变量,显示锁以及原子变量。 在多个线程中,当它们同时访问同个类时,每次执行的结果和单线程结果一致,且变量值跟预期一致,这个类则是线程安全的。 ArrayList跟Vector分别是否为线程安全: 首先这两个类都实现了List接口,都是有序集合。 ArrayList是线程不安全的,举例说明:      比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。在 单线程 运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;而如果是在 多线程 情况下,比如有两个线程,线程 A

保持Qt程序中GUI的响应流畅

南笙酒味 提交于 2020-04-21 04:16:09
保持Qt程序中GUI的响应流畅 来源 https://my.oschina.net/shelllife/blog/50813 如何使Qt 平台中的GUI保持响应流畅?一般来说耗时较长的操作,分为计算密集型操作和IO密集型操作,对于这两类操作如何提高响应速度。 而从操作的本质上来说,操作又可分为不可分解操作,如在第三方库中耗时较长的操作,以及可分解操作,其中可分解操作又可细分为串行操作和可并行操作,如何针对这几类操作来提高响应速度呢? 如何将异步的操作,如网络库中异步的读取数据方法,变成同步的操作? 此外对于多线程,普遍的看法是可以提供程序的运行速度,其实不然,不正确地使用线程常常会使程序变慢,那么在QT中是否可以通过多线程以外的方法来提高响应速度呢?本文给你解决。 首先什么是对GUI的响应?答:GUI的响应就是系统对于GUI事件的处理速度。 由于系统处理事件需要一定的时间,所以一般窗口系统都会提供一个事件队列来存储事件。如果把每个事件处理看成一个任务的话,那么事件处理就类似于操作系统对于任务按照优先级进行处理,使得每个任务的平均等待时间最小。那么就可以借鉴一下操作系统中的方法,比如: 分级,让较长的任务延后执行。 分时,对于较长的任务,让其执行一段时间后暂停,然后再执行。 减少每个任务运行的耗时,当然这是最基本的方法。 先看第一个分级

线程同步——可递归锁和非递归锁

人走茶凉 提交于 2020-04-20 09:16:55
最常见的进程/线程的同步方法有互斥锁(或称互斥量Mutex),读写锁(rdlock),条件变量(cond),信号量(Semophore)等。在Windows系统中,临界区(Critical Section)和事件对象(Event)也是常用的同步方法。 简单地说,互斥锁保护了一个临界区,在这个临界区中,一次最多进入一个线程。如果有多个线程在同一个临界区内活动,就有可能产生竞态(race condition)导致错误 读写锁从广义的逻辑上讲,也可以认为是一种共享版的互斥锁。如果对临界区大部分的操作是读操作而只有少部分是写操作,读写锁在一定程度上能够降低线程互斥产生的代价 条件变量允许线程以一种无竞争的方式去等待某个条件的发生。当该条件没有发生时,线程会一直处于休眠状态,当被其他线程通知条件已经发生时,线程才会被唤醒从而继续向下执行。条件变量是比较底层的同步原语,直接使用的情况不多。使用条件变量的一个经典的例子就是线程池(ThreadPool)了。 在学习操作系统的进程同步原理时,讲的最多的就是信号量了。通过精心设计信号量的PV操作,可以实现很复杂的进程同步情况(例如哲学家进餐问题和理发店问题)。而在现实的程序设计中,却极少有人使用信号量。能用信号量解决的问题似乎总能找到其他更清晰更简洁的设计手段去代替信号量。 本文的目的不是讲解如何使用这些锁,更多的是讲解容易被人忽略的一些关于锁的概念

ExecutionContext(执行上下文)综述

不想你离开。 提交于 2020-04-20 05:19:15
>>返回《C# 并发编程》 1. 简介 2. 同步异步对比 3. 上下文的捕获和恢复 4. Flowing ExecutionContext vs Using SynchronizationContext 5. 如何适用于 async/await 5.1. 实现方式 5.1.1. ExecutionContext 5.1.2. SynchronizationContext 5.2. 执行过程 5.2.1. SynchronizationContext 使用和控制 5.2.2. ExecutionContext 的流动无法控制 6. 两者的关系 7. 说明 7.1. 示例 7.1.1. 运行过程解析 7.1.2. 带来的思考 1. 简介 注意 : 本篇文章讲述的是在 .Net Framework 环境下的分析, 但是我相信这与 .Net Core 设计思想是一致,但在实现上一定优化了很多。 下面开始本次讲述: ExecutionContext 实际上只是线程相关其他上下文的容器。 有些上下文起 辅助 作用 有些上下文对 .Net 执行模型 至关重要 ExecutionContext 与 周围环境 的信息有关,这意味着,代码正在运行时,它存储了与 当前环境 或 “ context ” 有关的数据。 周围环境 : 代码执行处, 可以访问到 的变量、方法、属性等等。 2. 同步异步对比 在

ExecutionContext(执行上下文)综述

喜你入骨 提交于 2020-04-19 13:44:50
>>返回《C# 并发编程》 1. 简介 2. 同步异步对比 3. 上下文的捕获和恢复 4. Flowing ExecutionContext vs Using SynchronizationContext 5. 如何适用于 async/await 5.1. 实现方式 5.1.1. ExecutionContext 5.1.2. SynchronizationContext 5.2. 执行过程 5.2.1. SynchronizationContext 使用和控制 5.2.2. ExecutionContext 的流动无法控制 6. 两者的关系 7. 说明 7.1. 示例 7.1.1. 运行过程解析 7.1.2. 带来的思考 1. 简介 注意 : 本篇文章讲述的是在 .Net Framework 环境下的分析, 但是我相信这与 .Net Core 设计思想是一致,但在实现上一定优化了很多。 下面开始本次讲述: ExecutionContext 实际上只是线程相关其他上下文的容器。 有些上下文起 辅助 作用 有些上下文对 .Net 执行模型 至关重要 ExecutionContext 与 周围环境 的信息有关,这意味着,代码正在运行时,它存储了与 当前环境 或 “ context ” 有关的数据。 周围环境 : 代码执行处, 可以访问到 的变量、方法、属性等等。 2. 同步异步对比 在