首页 > 语言 > 关键词 > .NET最新资讯 > 正文

.NET上执行多线程应该注意的两点

2009-02-01 14:25 · 稿源:IT专家网论坛

线程管理

线程管理现在变得越来越容易了。在.NET架构中,你可以从线程池中获取线程。线程池是一个生成线程的工厂,如果它已经生成了一定数量的线程且还没有被破坏的话,对它的调用会被阻止。但是,如何确保不会有太多的线程在规定时间内运行?毕竟,如果每个线程能够占用一个CPU核的100%,那么有超过CPU核数量的线程运行,只会导致操作系统启动线程时间分配,这将导致上下文切换和低效率运行。换句话说,同一核上的两个线程不会以两倍的时长完成,可能需要用两倍再加10%左右的时间来完成。与一个线程相比较的话,三个线程在同一核上想占用100%的CPU使用率可能会需要3.25—3.5倍的时长来完成。我的经验是,每个核都有多个线程试图占用100%的CPU,但它们都不能达到目标。

所以,要怎样分配正在运行的线程数量呢?

有一个办法是在线程之间建立一个共享的旗语对象。在线程开始运行前,它会尝试调用旗语的WaitOne模式,并在完成后释放旗语。对CPU的核数量设置旗语限制,(使用EnvironmentProcessorCount功能限定);这将防止您的系统在同一时间运行的线程数多于核数量。与此同时,从线程池中拉出线程将确保您不会在同一时间创建过多线程。如果一次创建线程过多,即使他们并没运行,那也是浪费系统资源。因为每个线程都要消耗资源。使用旗语的一般模式如下所示:

以下为引用的内容:

static Semaphore threadBlocker;

static void Execute(object state)

{threadBlocker.WaitOne(); //Do work threadBlocker.Release(); }

static void RunThreads()

{threadBlocker = new Semaphore(0, Environment.ProcessorCount);
 
for(int x = 0; x <= 2000; x++)

{ThreadPool.QueueUserWorkItem(new WaitCallback (Execute)); }

}


当然还有其他一些办法可以解决这一问题。前一段时间我想要保持对象的一份清单。每个对象代表每个工人部件的完整状态。执行和完成时,工人部件都会被填入数据。并且他会设置某个功能以指示任务完成。主线程将扫描对象清单,如果运行的线程数量足够少,就开始运行另一个。说实话,虽然这个方法可行,但对于代码和调试来说这绝对是个噩梦,所以我一点也不推荐。

数据完整性

总体而言,在数据完整性方面,你要担心的问题是竞争条件和死锁。多个线程试图在同一时间更新相同的对象就会造成竞争条件,这将招致麻烦。想象一下如果使用下面这段代码:

以下为引用的内容:

int x=5;

x=x+10;

现在,如果线程A和线程B在同一时间运行此代码,将会发生什么情况?它可以运行得很好?还是会出现什么问题?如果出现问题,又是些怎样的问题呢?每个线程都不会一次执行全部语句。因此,我们可以按照以下顺序操作:

以下为引用的内容:

1. Thread A retrieves the value of x (5).

2. Thread B retrieves the value of x (5).

3. Thread A assigns x + 10 (15) to x.

4. Thread B assigns x + 10 (15) to x.

5. x is now equal to 15.
 

或者,相同的代码可以按照不同的顺序:

1. Thread A retrieves the value of x (5).

2. Thread A assigned x = 10 (15) to x.

3. Thread B retrieves the value of x (15).

4. Thread B assigns x + 10 (25) to x.

5. x is now equal to 25.

在.NET架构中,最简单也最常见的解决竞争条件的方法是使用“临界区”。而在VB.NET中,该语句是“加锁”,并在C#中是“锁定”,这两种语句都是把对象作为参数。其他尝试锁定相同对象实例使用的临界区(包括上文所指的)会阻止运行直到锁定解除,这样每次就只有一个临界区运行。我们先前举例的一段代码现在看起来是这样的:

以下为引用的内容:

int x=5;

object lockObject=new object();

Monitor.Enter(lockObject);

x=x+10;

Monitor.Exit(lockObject);


什么是监控器可以提供而临界区做不到的呢?答案是没有。除非你在解锁后需要更细粒度的控制权。有些复杂的代码可能需要锁定或长或短的一段时间,这都取决于运行的情况,比方一个变量的值。在这种情况下,选择监控器要比需选择临界区更合适。

另一个值得关注的有关数据完整性的问题是死锁。当多个线程锁定资源导致它们都不能够继续运行时,就会出现死锁。例如:

以下为引用的内容:

Thread A:

Monitor.Enter(object1);

Monitor.Enter(object2);

//Do work

Monitor.Exit(object1);

Monitor.Exit(object2);

Thread B:

Monitor.Enter(object2);

Monitor.Enter(object1);

//Do work

Monitor.Exit(object1);

Monitor.Exit(object2);

如果线程A和线程B都调用它们的第一段语句并且同时完成运行,那它们都无法调用它们的第二段语句——这就是一个死锁。所以编写代码的时候细心,要仔细想清楚怎样编写代码才更有利。死锁的发生常见于新手,因为他们过分设置锁定把它变得太详细了。如果代码被嵌套锁定通常表明需要对编写的代码加以认真检查。

网友热搜:

  • 相关推荐
  • 大家在看
  • 锐龙9 3900XT性能偷跑:单/多线程均提升约5%

    AMD最近发布了鸡血加速版的锐龙3000XT系列,将于7月7日上市,国行价格也已公布:锐龙9 3900XT 3899元、锐龙7 3800XT 3049元、锐龙5 3600XT 1859元。相比于锐龙3000X系列的对应型号,新品的加速

  • 微软(中国)被列为被执行人 执行标的超95万

    据天眼查数据显示, 近日,微软(中国)有限公司新增一条被执行人记录,执行法院为北京市第一中级人民法院,执行标的952215,案号为(2020)京 01 执 571 号。

  • 美图:陈家荣为非执行董事,蒉莺春为独立非执行董事

    美图发布公告,股东周年大会的投票表决结果,美图董事会宣布,自2020年6月3日起,陈家荣获选为非执行董事,蒉莺春获选为独立非执行董事。

  • 微软中国被列为被执行人 执行标的近百万元

    据天眼查显示,微软中国有限公司近日新增一条被执行人记录,执行法院为北京市第一中级人民法院,执行标的952215,案号为(2020)京 01 执 571 号。

  • 微软中国被列为被执行人 执行标的952215

    6 月 4 日,微软(中国)有限公司新增一条被执行人记录,执行法院为北京市第一中级人民法院,执行标的952215,案号为(2020)京 01 执 571 号。资料显示,微软(中国)有限公司成立于 1995 年 11 月,注册资本约1. 19 亿美元,法定代表人为柯睿杰(Alain Gilles Joseph Crozier),该公司由微软公司全资持股。

  • 微软(中国)有限公司被列为被执行人 执行标的952215

    DoNews 6月8日消息(记者 吴丽)天眼查数据显示, 近日,微软(中国)有限公司新增一条被执行人记录,执行法院为北京市第一中级人民法院,执行标的952215,案号为(2020)京01执571号。微软(中国)有限公司成立于1995年11月,注册资本约1.19亿美元,法定代表人为柯睿杰(Alain Gilles Joseph Crozier),该公司由微软公司全资持股。

  • 猫眼娱乐程武为非执行董事

    DoNews 6月8日消息(记者 程梦玲)猫眼娱乐发布公告称,委任程武为公司非执行董事,委任刘琳为独立非执行董事 ,2020年6月9日生效。程武现任腾讯集团副总裁、阅文集团首席执行官兼腾讯影业首席执行官。刘琳曾就职于美团点评担任高级副总裁、就职于腾讯担任人力资源部总经理及总裁办管理咨询部总经理,现均已离任。公告同时披露,公司原非执行董事湛炜标、原独立非执行董事罗振宇已辞任相应职务,于2020年6月9日生效。

  • 永安行科技股份有限公司成被执行人 执行标的60万

    天眼查数据显示,近日,永安行科技股份有限公司被石狮市人民法院列为被执行人,执行标的600000,案号为(2020)闽0581执3960号 。永安行科技股份有限公司成立于2010年8月,注册资本约1.88亿人民币,法定代表人为永安行董事长孙继胜,公司经营范围包括公共自行车系统的开发、制造、集成、安装、调试、销售及公共自行车系统信息技术服务,运营管理服务;自行车、电动自行车、电动三轮车、电动滑板车、电动汽

  • 呷哺呷哺餐饮管理有限公司被列为被执行人 执行标的为227338

    DoNews 6月4日消息(记者 吴丽)天眼查数据显示,近日,呷哺呷哺餐饮管理有限公司被列为被执行人,执行标的227338,执行法院为天津市津南区人民法院,案号为(2020)津0112执1624号。据了解,呷哺呷哺被列为被执行人的原因,为天津科诚房地产开发有限公司与呷哺呷哺餐饮管理有限公司的相关租赁合同纠纷。呷哺呷哺餐饮管理有限公司成立于2008年9月,注册资本5500万人民币,法定代表人为刘冠纬,经营范围包括餐饮服务;加工火锅底料?

  • 神州优车股份有限公司全资子公司成被执行人 执行标的112259

    DoNews 6月24日消息(记者 吴丽)天眼查数据显示,6月22日,上海亿君汽车服务有限公司被上海市闵行区人民法院列为被执行人,执行标的112259。上海亿君汽车服务有限公司成立于2014年12月,法定代表人为曾庆祝,公司经营范围包括机动车驾驶服务,商务咨询,该公司为神州优车股份有限公司的全资子公司。值得一提的是,天眼查十大股东信息显示,神州优车股份有限公司的最大股东为陆正耀,持股比例10.05%。

  • 阿里影业:常扬内部调职辞任非执行董事

    昨日晚间,阿里影业发布公告称,自 2020 年 6 月 24 日起,常扬因内部调职已辞任非执行董事。同日起,李捷委任执行董事及公司执行委员会成员。

  • 雷军卸任北京金山软件有限公司执行董事

    DoNews6月21日消息(记者 程梦玲)天眼查数据显示,近日,北京金山软件有限公司发生工商变更,雷军卸任该公司执行董事,由邹涛接任,与此同时,公司经营范围新增销售食品;餐饮服务;餐饮管理。北京金山软件有限公司成立于1994年7月,注册资本1000万人民币,法定代表人为邹涛,公司经营范围包括计算机软硬件及外围设备的技术开发、技术服务、技术咨询;销售计算机软硬件及外围设备、电子元器件等。天眼查数据显示,该公司工商披露?

  • 程武出任猫眼非执行董事,“腾猫”在下怎样的一盘大棋?

    电影行业即将复工,猫眼最近也有了新动作。6 月 8 日,猫眼娱乐发布公告,宣布将委任程武为公司非执行董事,委任刘琳女士为独立非执行董事 , 2020 年 6 月 9 日生效。同时公告披露,公司原非执行董事湛炜标、原独立非执行董事罗振宇已辞任相应职务,于 2020 年 6 月 9 日生效。

  • 新款联想拯救者Y7000P发布:升级8核16线程十代酷睿

    5月7日,联想正式发布了Y9000K、Y7000P、Y7000及R7000四款拯救者2020系列笔记本产品。其中,Y7000P 2020首发只有i7-10750H+16GB+1TB SSD+RTX2060显卡一个版本可选,原价9299元,首发售价8699元

  • 直播带货将有新规 将于7月发布执行

    近日,中国商业联合会发布通知,要求由该会下属媒体购物专业委员会牵头起草制定《视频直播购物运营和服务基本规范》和《网络购物诚信服务体系评价指南》等两项标准。

  • 呷哺呷哺被列为被执行人 官方表示是协助法院冻结

    呷哺呷哺是一家小火锅餐饮企业,成立于1998年。在近日这家企业被法院列入被执行人名单,执行标的为22. 7 万。对于被列为被执行人,呷哺呷哺公司也给出了回应:公司完全有能力支付这22. 7338 万,但因天津市津南区人民法院要求协助冻结这笔钱,所以依法暂时不还这笔钱。

  • 雷军卸任北京金山软件有限公司执行董事,由邹涛接任

    据天眼查数据显示,近日,北京金山软件有限公司发生工商变更,雷军卸任该公司执行董事,由邹涛接任。与此同时,公司经营范围新增销售食品、餐饮服务、餐饮管理。该公司工商披露的股东中,珠海金山软件有限公司为该公司最大股东,持股比例为 80%,第二大股东为珠海市西山居软件有限公司,持股比例为 20%。

  • 新规正式执行:美企现在能与华为合作制定5G标准了

    据美国媒体报道称,美国商务部工业和安全局(BIS) 正式对《出口管理条例》(EAR)(15 CFR第730-774部分)进行了修正,“实体清单”中由华为组织指定与建立5G应用标准有关的技术将附

  • 神州租车:严乐平已获委任为公司非执行董事

    ​今日,神州租车发布公告称,严乐平已获委任为本公司非执行董事,自 2020 年 6 月 12 日起生效。

  • 微软中国被列为被执行人是怎么回事?具体原因介绍

    据天眼查数据显示, 近日,微软(中国)有限公司新增一条被执行人记录,执行法院为北京市第一中级人民法院,执行标的952215,案号为(2020)京 01 执 571 号。目前这一消息也登上了微博热搜。

  • 参与评论
文明上网理性发言,请遵守新闻评论服务协议