急求多线程解决方法
假如我有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




