急求多线程解决方法

Jack2013tong 2006-03-30 10:50:39
假如我有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--;
}
}
}
...全文
595 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
loeweiyuan 2006-04-03
  • 打赏
  • 举报
回复
关注,学习~~
nameone 2006-04-03
  • 打赏
  • 举报
回复
UP
ycy589 2006-04-02
  • 打赏
  • 举报
回复
学习
rghwer 2006-04-01
  • 打赏
  • 举报
回复
lushawen(文仔) 这样来处理的话效率相信可以提高几倍 。。。 局域网的传送文件。。。。
=======================================
我觉得你这样 根本不能提高效率
多线程应该不是用在这些地方的。
li_guang_hua 2006-04-01
  • 打赏
  • 举报
回复
多线程并不是为了提高处理速度用的
bingbingcha 2006-04-01
  • 打赏
  • 举报
回复
所有的线程只是为了操作一块数据..不必让每个线程都处理一次..最好的办法是分快..将数据分为N块..用N个线程处理..

处理完毕之后,使用事件类通知主线程,最后将结果返回给主线程处理合并结果..这个时候,你再看看结果就明白了..

线程操作共享数据的时候,用lock即阻塞其他线程访问该资源..尽量避免lock独占锁.而应该采用算法分解资源..
aSalt 2006-04-01
  • 打赏
  • 举报
回复
lock 去掉,否则每次只能进入一个线程,理论上比一个独立的线程慢...
marvelstack 2006-03-31
  • 打赏
  • 举报
回复
我觉得多线程设计尽量减少临界区的访问,对数据范围进行划分进行分别处理不加锁会好点。
真相重于对错 2006-03-31
  • 打赏
  • 举报
回复
多线程在多cpu的机器上才会快,单cpu上还不如用单线程
zhongkeruanjian 2006-03-31
  • 打赏
  • 举报
回复
serversql(啊初) 正解。
多线程会增加线程创建开销,不快反慢。

多线程要有它适合使用的地方。
lushawen 2006-03-31
  • 打赏
  • 举报
回复
把元素放入数组,通过数组索引访问并处理元素。首先确定需要用几个线程来处理元素,就把数组分成几段,每一段用遍历的方式处理段内的元素。如第一个线程处理数组的0-1000个元素,第二个线程处理1001-2000个元素.....,这样来处理的话效率相信可以提高几倍。这只是我的思路而已,具体还没有测试过。我最近在写一个局域网的传送文件的程序,就需要用到这样的技术,正在完善当中。
xxuu503 2006-03-31
  • 打赏
  • 举报
回复
好多多分阿
sawam 2006-03-30
  • 打赏
  • 举报
回复
把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() );
}
charles_y 2006-03-30
  • 打赏
  • 举报
回复
多线程并不是为了提高处理速度用的。
使用多线程的目的一般是为了并发,例如在计算的时候能腾出手来让程序处理键盘输入,屏幕输出等,还有在一个资源被占用而程序需要等待的时候,另外的线程可以继续工作。
除了以上的情况,多线程使用不合理的话,一般都会降低效率,而不是提高
luojinat2005 2006-03-30
  • 打赏
  • 举报
回复
关注
Knight94 2006-03-30
  • 打赏
  • 举报
回复
“lock(typeof(bool))”你这句话,即所有的线程操作其中的临界区,都需要互斥,有线程使用就需要等待,所以和单线程的效率是一样。
zhaiyf 2006-03-30
  • 打赏
  • 举报
回复
我试了一下,好像是不太快。关注一下吧!
Jack2013tong 2006-03-30
  • 打赏
  • 举报
回复
谢谢大家,请大家继续发表意见.............
anthit 2006-03-30
  • 打赏
  • 举报
回复
使用多线程要注意临界区的问题
serversql 2006-03-30
  • 打赏
  • 举报
回复
多线程的功效类似千手观音.举个例子:
有个箱子,里面有100000张票,箱口只能容一只手进去拿票
那就算是万只手的效率也是一样的.

如果箱子有一千个口就不同了,一千只手同时进去拿票 ,你说快不?

箱口是一个瓶径

所以,你要取1000000个数,那就开多个口拉!要不然,你一万个线程也没有.
还有就是,你将数据处理和取数据分开应该会好点!
加载更多回复(5)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧