读书人

一共有N个线程可以同时M个线程并发(

发布时间: 2012-10-12 10:17:04 作者: rapoo

一共有N个线程,可以同时M个线程并发(M<N)。如何实现才能有效控制资源占用?
命题:一共有N个线程,可以同时M个线程并发(M<N)。
当前实现:下面程序的实现是一开始就new并start了N个线程,然后利用Mutex控制只有M个线程同时运行。这样非常消耗资源,因为有N-M个线程虽然没有运行,但都start了。
期望做到:能不能做到,如果只有M个线程并发,就只start M个线程?而不是一开始就start N个线程?以此减少线程资源的消耗。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication2
{
public class MutexControl
{
private const int THREAD_NUM = 50; //一共需要运行的线程数
private const int MAX_RUNTHREAD = 6; //可同时执行的最大线程数
//private AutoResetEvent[] event = null;

//这个变量仅为了测试当前运行的线程数
private static int testThreadNum = 0;

private Mutex[] muxConsole = null;

public MutexControl()
{
muxConsole = new Mutex[MAX_RUNTHREAD];
for (int i = 0; i < MAX_RUNTHREAD; i++)
{
muxConsole[i] = new Mutex();
//event[i] = new AutoResetEvent(false);
}
}

public void ApplySync()
{
//创建指定数量的线程
//是线程调用Run方法
//启动线程
for (int i = 0; i < THREAD_NUM; i++)
{
Thread trd = new Thread(new ParameterizedThreadStart(DoWork));

trd.Name = "Thread" + i;
trd.Start();
Console.WriteLine("已启动的线程:" + trd.Name);

}
}

//Thread execute main method.
public void DoWork(object o)
{
try
{
String currentThreadName = Thread.CurrentThread.Name;
int currentThreadID = System.Convert.ToInt32(currentThreadName.Substring(6).Trim());
int muxNo = currentThreadID % MAX_RUNTHREAD;
//当前线程申请互斥量
muxConsole[muxNo].WaitOne();

//Console.WriteLine("Thread_ID: " + currentThreadID);
//这句仅为了测试当前队列中的线程数量
Interlocked.Increment(ref testThreadNum);
Console.WriteLine("Thread_Name: " + Thread.CurrentThread.Name + " 允许运行");

//这句要替换成实际的线程运行的内容
Thread.Sleep(5000);

//当前线程运行完毕后释放互斥量
muxConsole[muxNo].ReleaseMutex();

//这句仅为了测试当前队列中的线程数量
Interlocked.Decrement(ref testThreadNum);
}
catch (AbandonedMutexException ame)
{
Console.WriteLine(Thread.CurrentThread.Name + " AbandoneMutexException: " + ame);
}
}
}
}

[解决办法]
线程池已经帮你做了这个东西吧 设置线程池的属性就可以了
[解决办法]

探讨
线程池已经帮你做了这个东西吧 设置线程池的属性就可以了

[解决办法]
哦,也可以读同一个文档的.net4.0版。http://msdn.microsoft.com/zh-cn/library/system.threading.threadpool(v=vs.100).aspx

.net4.0已经系统线程池的线程数,从25提升到1024个以上。而且有1024个以上的工作线程,外加1000个以上的IO完全端口操作线程。因此.net4.0的默认配置更强悍一些。
------解决方案--------------------


那么你可以读.net源代码来学习它的机制。

读书人网 >C#

热点推荐