CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

急求多线程解决方法

楼主huwei2003(凡)2006-03-30 10:50:39 在 .NET技术 / C# 提问

假如我有1000000个数据,想用多线程处理(调用同一处理方法),目的是想提高处理能力.但本人写的测试发现处理速度并不比不用多线程快,请高手们帮我看看,照我的写法贴个代码出来看看  
   
  public   static   int   n=20000;  
  public   void   begin()  
  {  
  Thread   thr=new   Thread(new   ThreadStart(write));  
  thr.Start();  
  }  
  public   void   write()  
  {  
  Thread[]   threadarray   =new   Thread[5];  
  for(int   i=0;i<5;i++)  
  {  
  threadarray[i]=new   Thread(new   ThreadStart(testwrite));  
   
  threadarray[i].Name="ithread---"+i.ToString();  
  threadarray[i].IsBackground=true;  
  threadarray[i].Start();  
  }  
   
  for(int   i=0;i<5;i++)  
  {  
  threadarray[i].Join();  
  }  
   
  }  
  public   void   testwrite()  
  {  
  while(n>0)  
  {  
  lock(typeof(bool))  
  {  
  if(n<0)  
  {  
  if(Thread.CurrentThread.IsAlive)  
  {  
  Thread.CurrentThread.Abort();  
  }  
  }  
  Console.WriteLine(n.ToString()+"***"+Thread.CurrentThread.Name.ToString());  
   
  Thread.Sleep(1);  
  n--;  
  }  
  }  
  } 问题点数:108、回复次数:25Top

1 楼zhaiyf(zhaiyf)回复于 2006-03-30 11:54:05 得分 5

我试了一下,好像是不太快。关注一下吧!Top

2 楼Knight94(愚翁)回复于 2006-03-30 12:21:45 得分 7

“lock(typeof(bool))”你这句话,即所有的线程操作其中的临界区,都需要互斥,有线程使用就需要等待,所以和单线程的效率是一样。  
  Top

3 楼luojinat2005()回复于 2006-03-30 12:29:36 得分 2

关注Top

4 楼charles_y(每天上网一小时)回复于 2006-03-30 12:37:12 得分 7

多线程并不是为了提高处理速度用的。  
  使用多线程的目的一般是为了并发,例如在计算的时候能腾出手来让程序处理键盘输入,屏幕输出等,还有在一个资源被占用而程序需要等待的时候,另外的线程可以继续工作。  
  除了以上的情况,多线程使用不合理的话,一般都会降低效率,而不是提高Top

5 楼sawam(sawam)回复于 2006-03-30 12:48:44 得分 7

把testwrite函数改成下面这样,无锁结构就快很多  
   
  public   void   testwrite()  
  {  
  int   tick1   =   Environment.TickCount;  
  while(n>0)  
  {  
  // lock(typeof(bool))  
  // {  
  if(n<0)  
  {  
  if(Thread.CurrentThread.IsAlive)  
  {  
  Thread.CurrentThread.Abort();  
  }  
  }  
  Console.WriteLine(n.ToString()+"***"+Thread.CurrentThread.Name.ToString());  
   
  Thread.Sleep(1);  
  int   tmp   =   n;  
  tmp   --;  
  n   =   tmp;  
  //n--;  
  // }  
  }  
  int   tick2   =   Environment.TickCount;  
  Console.WriteLine(   (tick2   -   tick1).ToString()   );  
  }Top

6 楼huwei2003(凡)回复于 2006-03-30 13:35:50 得分 0

继续关注中...Top

7 楼jiezhi(风满袖)回复于 2006-03-30 14:23:21 得分 8

你的这种情况,没有必要使用多个线程来做处理这些数据。  
   
  如果你非常想用的话,可以将这些数据分隔成几段,每段用一个线程来处理。  
   
  只有实际的测试数据才能说明问题,你测测看吧Top

8 楼huwei2003(凡)回复于 2006-03-30 15:00:31 得分 0

先分成段的话这样就很麻烦,那象这样情况用什么方法能提交处理能力呢?Top

9 楼Knight94(愚翁)回复于 2006-03-30 15:23:08 得分 7

多线程中,临界区越大影响越大,而你的临界区相当于整个线程入口函数,所以单线程和多线程效率是一样。Top

10 楼qghboy(飞雨)回复于 2006-03-30 19:22:24 得分 5

楼主的问题不是程序的问题,而是对线程概含不清晰的问题Knight94(愚翁)说得很有道理,并不是线程多速度就能快的  
  Top

11 楼serversql(啊初)回复于 2006-03-30 19:31:37 得分 5

多线程的功效类似千手观音.举个例子:  
  有个箱子,里面有100000张票,箱口只能容一只手进去拿票  
  那就算是万只手的效率也是一样的.  
   
  如果箱子有一千个口就不同了,一千只手同时进去拿票   ,你说快不?  
   
  箱口是一个瓶径  
   
  所以,你要取1000000个数,那就开多个口拉!要不然,你一万个线程也没有.  
  还有就是,你将数据处理和取数据分开应该会好点!Top

12 楼anthit()回复于 2006-03-30 19:34:01 得分 5

使用多线程要注意临界区的问题Top

13 楼huwei2003(凡)回复于 2006-03-30 21:52:45 得分 0

谢谢大家,请大家继续发表意见.............Top

14 楼zhongkeruanjian(编程亮子)回复于 2006-03-31 12:09:01 得分 5

serversql(啊初)   正解。  
  多线程会增加线程创建开销,不快反慢。  
   
  多线程要有它适合使用的地方。Top

15 楼hdt(倦怠)回复于 2006-03-31 12:11:32 得分 5

多线程在多cpu的机器上才会快,单cpu上还不如用单线程  
  Top

16 楼zhzuo(秋枫)回复于 2006-03-31 12:55:52 得分 5

我觉得多线程设计尽量减少临界区的访问,对数据范围进行划分进行分别处理不加锁会好点。Top

17 楼xxuu503(中国没有prison break只是因为the company不让拍)回复于 2006-03-31 17:06:36 得分 2

好多多分阿Top

18 楼lushawen(文仔)回复于 2006-03-31 20:38:57 得分 5

把元素放入数组,通过数组索引访问并处理元素。首先确定需要用几个线程来处理元素,就把数组分成几段,每一段用遍历的方式处理段内的元素。如第一个线程处理数组的0-1000个元素,第二个线程处理1001-2000个元素.....,这样来处理的话效率相信可以提高几倍。这只是我的思路而已,具体还没有测试过。我最近在写一个局域网的传送文件的程序,就需要用到这样的技术,正在完善当中。Top

19 楼rghwer()回复于 2006-04-01 00:54:36 得分 5

lushawen(文仔)     这样来处理的话效率相信可以提高几倍   。。。     局域网的传送文件。。。。  
  =======================================  
  我觉得你这样   根本不能提高效率  
  多线程应该不是用在这些地方的。Top

20 楼yuanarea(Sail before)回复于 2006-04-01 08:21:01 得分 5

lock   去掉,否则每次只能进入一个线程,理论上比一个独立的线程慢...Top

21 楼bingbingcha(不思不归,不孟不E,原来是头大灰狼)回复于 2006-04-01 08:35:25 得分 7

所有的线程只是为了操作一块数据..不必让每个线程都处理一次..最好的办法是分快..将数据分为N块..用N个线程处理..  
   
  处理完毕之后,使用事件类通知主线程,最后将结果返回给主线程处理合并结果..这个时候,你再看看结果就明白了..  
   
  线程操作共享数据的时候,用lock即阻塞其他线程访问该资源..尽量避免lock独占锁.而应该采用算法分解资源..Top

22 楼li_guang_hua(无声胜有声)回复于 2006-04-01 22:25:59 得分 5

多线程并不是为了提高处理速度用的Top

23 楼ycy589(ycy589)回复于 2006-04-02 09:56:01 得分 2

学习Top

24 楼nameone(过客)回复于 2006-04-03 09:38:46 得分 2

UPTop

25 楼loeweiyuan(杨柳岸)回复于 2006-04-03 21:57:23 得分 2

关注,学习~~Top

相关问题

  • 关于多线程通讯。急急急!!!
  • 关于多线程,急急急!
  • 急,Linux下的多线程编程
  • 谁有多线程的例子? 急
  • help:多线程同步(急!给分100)
  • 一个多线程的问题?急!!!!!!!!!!
  • 多线程同步问题(急)
  • 紧急求助java多线程编程!!!!!!!!!!!!!
  • 急需关于多线程的资料;
  • ★★★★★紧急求助,多线程的问题★★★★★

关键词

  • 多线程
  • 处理
  • 方法
  • thr
  • typeof
  • 看看
  • thread
  • lock
  • bool
  • write

得分解答快速导航

  • 帖主:huwei2003
  • zhaiyf
  • Knight94
  • luojinat2005
  • charles_y
  • sawam
  • jiezhi
  • Knight94
  • qghboy
  • serversql
  • anthit
  • zhongkeruanjian
  • hdt
  • zhzuo
  • xxuu503
  • lushawen
  • rghwer
  • yuanarea
  • bingbingcha
  • li_guang_hua
  • ycy589
  • nameone
  • loeweiyuan

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo