日期:2014-05-19  浏览次数:20734 次

2个线程的通讯问题 附上完整的代码,请大家帮忙,急!!~~
程序问题
程序入口同时开2个线程运行mMian(),在mMian()方法中再同时5个线程序运行subMain(),保证subMain运行完5次后,再开始下一次的mMian()循环。

小第用的vs2003   +   .net1.1   的版本。


------------下面是模拟代码——————————
新建一个控制台应用程序,将下面代码复制后可以直接运行
using   System;
using   System.Threading;

namespace   moreThread
{
///   <summary>
///   Class1   的摘要说明。
///   </summary>
class   Class1
{
private   ManualResetEvent   mainThread   =   new   ManualResetEvent(false);
private   ManualResetEvent   subThread   =   new   ManualResetEvent(false);
private   int   pCount   =   0   ;

private     void   subMain()
{
lock   (this)
{
Console.WriteLine(   pCount.ToString());



if(   this.pCount   %   5   ==   0)
subThread.Set();

Console.WriteLine( "运行结束:发送子信号 ");
}

}    


private   void   mMian()
{
lock   (   this   )
{
int   sCount   =   0;  

for   (   int   i=0;   i <=20;   i++   )
{
Thread   sThread   =   new   Thread(   new   ThreadStart(   subMain   )   );
sThread.Start();

Console.WriteLine( "子线程开始 ");

sCount++;

if(sCount   > =5)   //不能超过5个线程
{

sCount   =   0;   //

this.subThread.Reset();
Console.WriteLine( "等待子型号 ");
this.subThread.WaitOne();   //等待子信号

this.mainThread.Set();   //给主信号
}


}

}
}


static   void   Main(string[]   args)
{
Class1   oClass   =   new   Class1();
int   sCount   =   0;

for   (   int   w   =   0;   w   <=   10   ;   w++)
{
oClass.mainThread.Reset();
oClass.pCount   =   w;

Thread   oThread   =   new   Thread(   new   ThreadStart(   oClass.mMian   )   );

oThread.Start();

Console.WriteLine( "主线程开始: ");

sCount++;
if   (   sCount   ==   2   )   //不能超过2个线程
{
sCount   =   0;  
Console.WriteLine( "等待 ");
oClass.mainThread.WaitOne();
Thread.Sleep(1000);   //cpu

}


}
}
}
}

------解决方案--------------------
看看我这个实现你的逻辑了没有,用WaitHandle.WaitAll,它可以让你等所有的线程都结束后再向下执行后边的代码, 比设置记数器好. 多个线程之间的公共记数器很难控制,而且加锁后效率低,失去多线程的优势了.

using System;
using System.Threading;

namespace moreThread
{
class SubMainClass
{
public ManualResetEvent SubMainFinished = new ManualResetEvent(false);
private int _mainThreadID = 0;

public SubMainClass(int mainThreadID)
{
_mainThreadID = mainThreadID;
}

public void subMain()
{
Co