关于线程AutoResetEvent应用的疑问

pm666 2009-11-27 11:09:39
以下是我使用AutoResetEvent测试的一段简单代码

using System;
using System.Threading;

namespace AutoResetEvent_Examples
{
class MyMainClass
{
//初始的时候是没有信号的,这里的意思是指参数false
const int numIterations = 10; //重复次数设置多少都无所谓,为让大家看清楚设置了100
static AutoResetEvent myResetEvent = new AutoResetEvent(false);
static int number;

static void Main()
{
//创建并开始一个线程。
Thread myReaderThread = new Thread(new ThreadStart(MyReadThreadProc));
myReaderThread.Name = "副线程";
myReaderThread.Start();

for (int i = 1; i <= numIterations; i++)
{
Console.WriteLine("-----主线程的Number数值: {0}", i);
number = i;

//发信号,说明值已经被写进去了。这里的意思是说Set是一个发信号的方法。
myResetEvent.Set();

//*************设置当前线程睡眠时间*****************
//第一次测试时间间隔为20,保证每次myResetEvent.Set()释放当前资源时副线程都有足够的时间捕获并且运行
//第二次测试时间间隔为0;主线程释放资源,但立刻对资源进行申请
Thread.Sleep(20);
}

//终止阅读线程。

myReaderThread.Abort();

Console.ReadLine();
}

static void MyReadThreadProc()
{
while (true)
{
//在数据被作者写入之前不会被读者读取
//在上次读取之前至少有一次。
myResetEvent.WaitOne();
Console.WriteLine("{0} 的Number数值: {1}", Thread.CurrentThread.Name, number);
}
}
}
}

提示:请注意注释行//*************设置当前线程睡眠时间*****************
第一次运行时候 Thread.Sleep(20);运行结果和预期一样如下:
-----主线程的Number数值:1
副线程的Number数值:1
-----主线程的Number数值:2
副线程的Number数值:2
-----主线程的Number数值:3
副线程的Number数值:3
-----主线程的Number数值:4
副线程的Number数值:4
-----主线程的Number数值:5
副线程的Number数值:5
-----主线程的Number数值:6
副线程的Number数值:6
-----主线程的Number数值:7
副线程的Number数值:7
-----主线程的Number数值:8
副线程的Number数值:8
-----主线程的Number数值:9
副线程的Number数值:9
-----主线程的Number数值:10
副线程的Number数值:10




但是当我将Thread.Sleep(0);后再测试出现以下情况,让我不能理解
-----主线程的Number数值:1
-----主线程的Number数值:2
-----主线程的Number数值:3
副线程的Number数值:1
副线程的Number数值:3
-----主线程的Number数值:4
-----主线程的Number数值:5
-----主线程的Number数值:6
-----主线程的Number数值:7
-----主线程的Number数值:8
副线程的Number数值:4
副线程的Number数值:8
-----主线程的Number数值:9
-----主线程的Number数值:10


问题:
1.副线程在执行Console.WriteLine("{0} 的Number数值: {1}", Thread.CurrentThread.Name, number);
前都会调用WaitOne()方法组织当前线程;为什么会出现连续的两次的副线程输出:
副线程的Number数值:1
副线程的Number数值:3

2.变量number是个静态变量;为什么会出现
-----主线程的Number数值:3
副线程的Number数值:1
副线程的Number数值:3
.
.
.
.
.
-----主线程的Number数值:8
副线程的Number数值:4
副线程的Number数值:8
这种现象
...全文
104 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
herryz 2010-10-21
  • 打赏
  • 举报
回复
Thread.Sleep(0);
myResetEvent.Set()释放当前资源时副线程没有足够的时间捕获并且运行
所以就会出现以上不与理想一致的现象
Sugar_Tiger 2009-11-28
  • 打赏
  • 举报
回复
你改成Thread.Sleep(0);多运行几次,可能会出现不同的结果的,这可能是因为你只给副线程加了锁,而没给主线程加锁,而系统给不同线程分配的时间片并不一样.所以导致这样的结果.具体可以参考我上面那篇博文的例子,挺简单的.
liyoubaidu 2009-11-28
  • 打赏
  • 举报
回复
先留个脚印
Sugar_Tiger 2009-11-28
  • 打赏
  • 举报
回复
你可以参照一下我这篇文章,写AutoResetEvent的用法的,结构很清晰
http://blog.csdn.net/Sugar_Tiger/archive/2009/09/25/4593959.aspx
pm666 2009-11-27
  • 打赏
  • 举报
回复
怎么没有人回答呀?我自己顶下先

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧