饭店的运作模式(线程、线程池、任务)

前台线程(服务员、大堂经理):主程序必须等待线程执行完毕后才可退出程序。Thread默认为前台线程,也可以设置为后台线程

后台线程(厨师、配菜):主程序执行完毕后就退出,不管线程是否执行完毕。ThreadPool默认为后台线程

所有前台线程停止运行时,CLR强制终止仍在运行的任何后台线程,后台线程被直接终止;不抛出异常。(前台服务员都停止工作了,说明客户都走光了。你后台厨师、配菜还忙个什么劲!)

线程消耗:开启一个新线程,线程不做任何操作,都要消耗1M左右的内存(这些个服务员、大堂经理、厨师什么活都不干,会白吃、白喝、白拿工资的)

ThreadPoll是线程池(一个饭店的服务员、厨师、配菜) 其目的是为了合理利用线程资源(使用线程池中的空闲线程,不必在开启新线程,以及统一管理线程(线程池中的线程执行完毕后,回归到线程池里,等待新任务).(一个服务员可以服务多个桌顾客请求,如果忙不过来就不断叫新的服务员过来,一个服务员忙完。就回去等待下一个任务分配)

总结:ThreadPoll性能优于Thread,但是Thread和ThreadPoll对线程的控制都不是很好,例如线程等待(线程执行一段时间无响应后,直接停止线程,释放资源 等 都没有直接的API来控制 只能通过硬编码来实现,同时ThreadPool使用的是线程池全局队列,全局队列中的线程依旧会存在竞争共享资源的情况,从而影响性能。

然后task(一个会利用时间的好厨师)【厨师(线程),同时处理多个任务:蒸鱼(方法A)的同时,又去做其他菜(任务B),等蒸鱼做好(方法A返回)继续接收返回给】

Task的背后的实现也是使用了线程池线程,但它的性能优于ThreadPoll,因为它使用的不是线程池的全局队列,而是使用的本地队列,使线程之间的资源竞争减少。同时Task提供了丰富的API来管理线程、控制。但是相对前面的两种耗内存,Task依赖于CPU对于多核的CPU性能远超前两者,单核的CPU三者的性能没什么差别。

原文地址:https://www.cnblogs.com/gougou1981/p/10342267.html

时间: 2024-07-29 16:21:36

饭店的运作模式(线程、线程池、任务)的相关文章

twisted的defer模式和线程池

Reference: http://www.cnblogs.com/mumuxinfei/p/4528910.html 前言: 最近帮朋友review其模块服务代码, 使用的是python的twisted网络框架. 鉴于之前并没有使用过, 于是决定好好研究一番. twisted的reactor模型很好的处理了网络IO事件, 以及定时任务触发. 但包处理后的业务逻辑操作, 需要根据具体的场景来决定. 本文将讲述twisted如何实现half-sync/half-async的模式, 其线程池和def

线程系列04,传递数据给线程,线程命名,线程异常处理,线程池

本篇体验:如何传递数据给线程,如何给线程命名,线程的异常处理,线程池.实在是太基础的部分. □ 传递数据给线程 ※ 使用Lambda表达式 class Program { static void Main(string[] args) { Thread t = new Thread(() => Say("hello", "world")); t.Start(); } static void Say(string msg, string msg1) { Cons

线程同步——用户模式下线程同步——Interlocked实现线程同步

1 线程同步分为用户模式下的线程同步和内核对象的线程同步. 2 3 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 4 5 6 7 8 //1.利用原子访问: Interlocked系列函数,关于Interlocked系列函数,我需要知道的是他们,执行的极快 9 10 //(1)首先是InterlockedExchangeAdd兄弟函数, 11 //第一个参数 Addend 代表进行操作数的地址, 12 //第二个参数 Value 代表增加的值,如果是想进行减法,传负数即可 13

线程同步——用户模式下线程同步——Slim读写锁实现线程同步

1 //Slim读/写锁实现线程同步 2 SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问. 3 但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程) 4 和哪些想要更新资源值的线程(写入者线程).让所有读取者资源在同一时刻访问共享资源应该是 5 可行的,这是因为仅仅读取资源并不存在破坏数据的风险.只有当写入者线程想要对资源进行更新时才需要同步. 6 这种情况下,写入者线程应该独占资源访问权:任何线程,无论是读取还是写入者线程,都不许访问

线程同步——用户模式下线程同步——关键段实现线程同步

1 //2.使用关键段实现线程同步 2 使用时必须有以下几个步骤 3 //(1)必须先定义 CRITICAL_SECTION 结构 4 CRITICAL_SECTION g_cs; 5 //(2)初始化关键段 CRITICAL_SECTION 6 InitializeCriticalSection(&g_cs); 7 //(3)在线程中调用 8 DWORD WINAPI ThreadFunOne(PVOID pvParam) 9 { 10 EnterCriticalSection(&g_c

java future模式 所线程实现异步调用(转载

java future模式 所线程实现异步调用(转载) 在多线程交互的中2,经常有一个线程需要得到另个一线程的计算结果,我们常用的是Future异步模式来加以解决.Future顾名思意,有点像期货市场的“期权”,是“对未来的一种凭证”,例如当我们买了某个房地产开发商的期房,交钱之后,开发商会给我们一个凭证(期权),这个凭证告诉我们等明年某个时候拿这个凭证就可以拿到我们所需要的房子,但是现在房子还没建好.市场上之所以有“期货”,也正由于有这种需求,才有这种供给. 这种应用在GUI上用的比较多,在设

C#线程 线程进阶

第四部分:高级线程 非阻塞同步 前面我们说过,即使在分配或增加字段的简单情况下,也需要同步.尽管锁定始终可以满足此需求,但是竞争性锁定意味着线程必须阻塞,从而遭受上下文切换的开销和调度的延迟,这在高度并发且对性能至关重要的情况下是不希望的. .NET Framework的非阻塞同步结构可以执行简单的操作,而无需阻塞,暂停或等待. 正确编写非阻塞或无锁的多线程代码非常棘手!特别是,内存障碍很容易出错(volatile关键字甚至更容易出错).在解除普通锁之前,请仔细考虑是否真的需要性能优势.请记住,

互联网金融十种运作模式

互联网金融十种运作模式 2017-07-07 牛行长 互联网金融是依托于虚拟支付平台.云计算.社交网络以及搜索引擎等互联网工具而产生的新兴金融模式,让理财行为从传统的柜台操作过渡到虚拟的互联网上.互联网金融模式主要包括:第三方支付平台模式.P2P网络小额信贷模式.基于大数据的金融服务平台模式.众筹模式.网络保险模式.金融理财产品网络销售等. 近年来,互联网金融通过各种方式,在不知不觉中成了我们每天必谈的话题,从"余额宝"开始发展至今,它已经影响到我们日常生活的方方面面:微信支付.支付宝

线程系列01,前台线程,后台线程,线程同步

在控制台应用程序集中,Main方法开始的是一个线程.如果要再创建线程,需要用到System.Threading这个命名空间. □ 创建第一个线程 using System; using System.Threading; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { var thread = new Thread(DoSth); thread.Start(); } static