首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

2个线程的通讯有关问题 附上完整的代码,请大家帮忙,

2012-01-23 
2个线程的通讯问题 附上完整的代码,请大家帮忙,急!!~~程序问题程序入口同时开2个线程运行mMian(),在mMian(

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装的路径了

热点排行