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()
{
Console.WriteLine(string.Format( "主线程 {1} - 子线程 {0} 开始 ",
System.Threading.Thread.CurrentThread.GetHashCode(),
_mainThreadID ));
//Do something here...
System.Threading.Thread.Sleep(500);
SubMainFinished.Set();
Console.WriteLine(string.Format( "主线程 {1} - 子线程 {0} 结束 ",
System.Threading.Thread.CurrentThread.GetHashCode(),
_mainThreadID));
}
}
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
public ManualResetEvent mainThread = new ManualResetEvent(false);
private void mMian()
{
WaitHandle[] waitHandles = new WaitHandle[5];
for (int i = 0; i <= 2; i++)
{
Console.WriteLine(string.Format( "主线程 {0}: 5个子线程开始 ", System.Threading.Thread.CurrentThread.GetHashCode()));
for (int j = 0; j < 5; j++)
{
SubMainClass subMainClass = new SubMainClass(System.Threading.Thread.CurrentThread.GetHashCode());
Thread sThread = new Thread(new ThreadStart(subMainClass.subMain));
waitHandles[j] = (WaitHandle)subMainClass.SubMainFinished;
sThread.Start();
}
WaitHandle.WaitAll(waitHandles);
}
mainThread.Set();
Console.WriteLine(string.Format( "主线程 {0}: 5个子线程结束\r\n ", System.Threading.Thread.CurrentThread.GetHashCode()));
}
static void Main(string[] args)
{
WaitHandle[] waitHandles = new WaitHandle[2];
for (int w = 0; w <= 2; w++)
{
Console.WriteLine( "2 个主线程开始 > > > > ");
for (int i = 0; i < 2; i++)
{
Class1 oClass = new Class1();
Thread oThread = new Thread(new ThreadStart(oClass.mMian));
waitHandles[i] = (WaitHandle)oClass.mainThread;
oThread.Start();
}
WaitHandle.WaitAll(waitHandles);
Console.WriteLine( "2 个主线程结束 < < < < ");
Thread.Sleep(2000); //cpu
}
Console.ReadLine();
}
}
}
[解决办法]
AutoResetEvent
找这个
.Net带的例子有好几个,路径是
C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Samples\Technologies\Threading\WaitSynchronization\cs
就看你的.NET装的路径了