不积跬步,无以至千里;不积小流,无以成江海

Our practice

不积跬步,无以至千里;不积小流,无以成江海

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

   多线程

   优点:

         在于可以提高CPU的利用率——任何一个程序员都不希望自己的程序很多时候没事可干,在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。

   缺点:

           线程也是程序,所以线程需要占用内存,线程越多占用内存也越多

       多线程需要协调和管理,所以需要CPU时间跟踪线程

       线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题

       线程太多会导致控制太复杂,最终可能造成很多Bug

 

ThreadPool.SetMaxThreads方法

设置线程池中同步可以活动的线程的最大数量. 所以超过这个数据的其它线程,必须等待其它线程完成后方可激活。

You cannot set the number of worker threads or the number of I/O completion threads to a number smaller than the number of processors in the computer.

例子原代码下载

Example

using System;

using System.Threading;



public class Fibonacci

{

public Fibonacci(int n, ManualResetEvent doneEvent)

{

_n 
= n;

_doneEvent 
= doneEvent;

}




// Wrapper method for use with thread pool.

public void ThreadPoolCallback(Object threadContext)

{

int threadIndex = (int)threadContext;

Console.WriteLine(
"thread {0} started", threadIndex);

_fibOfN 
= Calculate(_n);

Console.WriteLine(
"thread {0} result calculated", threadIndex);

_doneEvent.Set();

}




// Recursive method that calculates the Nth Fibonacci number.

public int Calculate(int n)

{

if (n <= 1)

{

return n;

}




return Calculate(n - 1+ Calculate(n - 2);

}




public int N get return _n; } }

private int _n;



public int FibOfN get return _fibOfN; } }

private int _fibOfN;



private ManualResetEvent _doneEvent;

}




public class ThreadPoolExample

{

static void Main()

{

const int FibonacciCalculations = 10;



// One event is used for each Fibonacci object

ManualResetEvent[] doneEvents 
= new ManualResetEvent[FibonacciCalculations];

Fibonacci[] fibArray 
= new Fibonacci[FibonacciCalculations];

Random r 
= new Random();



// Configure and launch threads using ThreadPool:

Console.WriteLine(
"launching {0} tasks", FibonacciCalculations);

for (int i = 0; i < FibonacciCalculations; i++)

{

doneEvents[i] 
= new ManualResetEvent(false);

Fibonacci f 
= new Fibonacci(r.Next(20,40), doneEvents[i]);

fibArray[i] 
= f;

ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i);

}




// Wait for all threads in pool to calculation

WaitHandle.WaitAll(doneEvents);

Console.WriteLine(
"All calculations are complete.");



// Display the results

for (int i= 0; i<FibonacciCalculations; i++)

{

Fibonacci f 
= fibArray[i];

Console.WriteLine(
"Fibonacci({0}) = {1}", f.N, f.FibOfN);

}


}


}

Sample Output

launching 10 tasks...
result calculated...
result calculated...
result calculated...
result calculated...
result calculated...
result calculated...
result calculated...
result calculated...
result calculated...
result calculated...
all calculations complete
Fibonacci(22) = 17711
Fibonacci(25) = 75025
Fibonacci(32) = 2178309
Fibonacci(36) = 14930352
Fibonacci(32) = 2178309
Fibonacci(26) = 121393
Fibonacci(35) = 9227465
Fibonacci(23) = 28657
Fibonacci(39) = 63245986
Fibonacci(22) = 17711


详见于MSDN http://msdn.microsoft.com/en-us/library/3dasc8as(VS.80).aspx
posted on 2008-07-29 17:39  英怀  阅读(350)  评论(0编辑  收藏  举报