public class Program
{
static object ball = new object();
public static void Main()
{
Thread threadPing = new Thread(ThreadPingProc);
Thread threadPong = new Thread(ThreadPongProc);
threadPing.Start();
threadPong.Start();
Console.ReadKey();
}
static void ThreadPingProc()
{
lock (ball)
{
for (int i = 0; i < 5; i++)
{
System.Console.WriteLine("张三 ");
Monitor.Wait(ball);
}
}
}
static void ThreadPongProc()
{
lock (ball)
{
for (int i = 0; i < 5; i++)
{
System.Console.WriteLine("李四 ");
Monitor.Pulse(ball);
}
}
}
}
两个问题:
1:首先执行 threadPing.Start();所以,无论如何,第一句都该是"张三"吧,可为什么多执行几次,第一句有时候是"李四"2:MSDN说的,
Pulse、PulseAll 和 Wait 方法必须从同步的代码块内调用。 此话怎讲?我上面的代码似乎就没有这样,没报错呢?
{
static object ball = new object();
public static void Main()
{
Thread threadPing = new Thread(ThreadPingProc);
Thread threadPong = new Thread(ThreadPongProc);
threadPing.Start();
threadPong.Start();
Console.ReadKey();
}
static void ThreadPingProc()
{
lock (ball)
{
for (int i = 0; i < 5; i++)
{
System.Console.WriteLine("张三 ");
Monitor.Wait(ball);
}
}
}
static void ThreadPongProc()
{
lock (ball)
{
for (int i = 0; i < 5; i++)
{
System.Console.WriteLine("李四 ");
Monitor.Pulse(ball);
}
}
}
}
两个问题:
1:首先执行 threadPing.Start();所以,无论如何,第一句都该是"张三"吧,可为什么多执行几次,第一句有时候是"李四"2:MSDN说的,
Pulse、PulseAll 和 Wait 方法必须从同步的代码块内调用。 此话怎讲?我上面的代码似乎就没有这样,没报错呢?
threadPong.Start();这也不过是向系统注册了线程启动要求,这个Start操作立刻结束了,而此时并没有执行你要执行的方法。
------------------------
这个不是绝对的,要看CPU的工作情况。 如果碰巧分配时间片的时候顿了一下,那么就不会和你代码的顺序一致了。就是这个不一定是按照你代码的顺序执行的。虽然大多数情况是(CPU低负载)
Pulse、PulseAll 和 Wait 方法必须从同步的代码块内调用。 此话怎讲?我上面的代码似乎就没有这样,没报错呢?
---------------------
lock (ball)
{
Monitor.Wait(ball);
}lock (ball)
{
Monitor.Pulse(ball);
}
lock 就是同步块
{
for (int i = 0; i < 5; i++)
{
System.Console.WriteLine("李四 ");
Monitor.Pulse(ball);
}
}
--------------
这个其实写法是有些问题,虽然它可以work 应该改成
lock (ball)
{
for (int i = 0; i < 5; i++)
{
System.Console.WriteLine("李四 ");
}
Monitor.Pulse(ball);
}因为for循环在ThreadPongProc的lock (ball){} 中, 就算调用了Monitor.Pulse(ball)张三也不会输出,因为 ball 在循环结束前一直是锁定状态所以在循环后调用一次 Monitor.Pulse(ball) 就可以了,告知ThreadPingProc可以继续执行
这是为什么啊?
这是为什么啊?
{
lock (ball)
{
for (int i = 0; i < 5; i++)
{
System.Console.WriteLine("张三 ");
Monitor.Wait(ball); }
}
}
---------------------------------
static void ThreadPongProc()
{
lock (ball) {
for (int i = 0; i < 5; i++)
{
System.Console.WriteLine("李四 ");
Monitor.Pulse(ball); }
}
}
-------------------------------------------------
同步的代码块指的就是lock (ball)
{}你看看你的 Pulse 和 Wait 是不是都在 lock 内调用的
这已经说的很明白了啊
这能说明Pulse、PulseAll 和 Wait 方法是从同步的代码块内调用的吗?
还是说,一个Lock语句块内部,必须即写Pulse,又要写Wait
此话的意思,是不是不允许Pulse和Wait同时进行?
那为什么Pulse、PulseAll 和 Wait 方法必须从同步的代码块内调用,必须写在Lock块内部?
其意思完全等于:
Pulse、PulseAll 和 Wait 方法必须写在Lock语句块内
是这样的吗?
{
private static object ball=new object();
static void Main(string[] args)
{
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(Show));
System.Threading.Thread s = new System.Threading.Thread(new System.Threading.ThreadStart(Display));
s.Priority = System.Threading.ThreadPriority.Highest;
t.Priority = System.Threading.ThreadPriority.Lowest;
t.Start();
s.Start();
Console.Read();
} static void Show()
{
lock (ball)
{ for (int i = 0; i < 5; i++)
{ System.Console.WriteLine("张三 ");
System.Threading.Monitor.Wait(ball);
}
}
}
static void Display()
{
lock (ball)
{
for (int i = 0; i < 5; i++)
{
System.Console.WriteLine("李四 ");
System.Threading.Monitor.Pulse(ball);
}
} }
}首先线程的调用有操作系统来管理的,我设置了调度级别,所以T线程先start,但是S线程先跑的。
线程的调用优先级,你可以试试
Wait、Pulse的阻塞、唤醒,只能对同一对象锁起作用,此Pulse不能唤醒彼Wait
ok ?这样阐释,不知对否?
你可以看看他的帖子,
http://topic.csdn.net/u/20111206/15/744c70de-49dc-4694-a09e-180438d7f8f0.html