作者teamspike (市政府7F)
看板C_Sharp
标题[问题] 我以为这样会死结,但是却不会!!
时间Tue Jun 3 18:12:08 2008
各位前辈大家好
话说小弟念到Monitor.Wait()和Pulse()时
看到了如下的范例
简单来说,就是模拟处理20笔资料,处理10笔才列印1次的情况
就是列印两次罗
int dataOutput = 0; //目前在处理哪一笔资料
int dataSum = 0; //共列印了多少资料
static void Main()
{
Thread t1 = new Thread(new ThreadStart(DataHandle));
Thread t2 = new Thread(new ThreadStart(DataPrint));
t1.Start();
t2.Start();
t1.Join();
t2.Join();
}
void DataHandle()
{
lock(this)
{
for(int i=0; i<20; i++)
{
if (dataOuptut == 10)
Monitor.Wait(this);
dataOupt++;
列印dataOut值;//我处理的是哪一笔资料
if (dataOutput == 10)
Monitor.Pulse(this);
}
}
}
void DataPrint()
{
lock(this)
{
do
{
if (dataOutput == 0) Monitor.Wait(this);
列印dataOutput值;//我列印的是哪一笔资料
dataOutput--;
dataSum++;
列印dataSum值;//我已经印了dataSum笔罗
if (dataOutput == 0)
Monitor.Pulse();
}
while (dataSum < 20);
}
}
刚开始执行的时候,t2应该会Wait()吧,因为dataOutput=0阿
於是就换t1一直跑到dataOutput=10的时候,然後也Wait()
那应该不会继续往下执行到dataHandle()中的Pulse()才是...
然後我以为t1和t2都会被block住
结果这个程式能正常执行耶...
他们两个人到底是怎麽解套的?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.116.216.193
1F:推 cole945:t2不一定会先执行呀.. 06/03 19:23
2F:推 tomex:lock只保证多执行绪不会进入同一区块,但不保证顺序 06/03 23:58
3F:推 tomex:假如t1/t2执行绪跑不同区块,lock(this)也是没用的。 06/03 23:58
4F:推 cole945:不同区块有用吧.__." lock是认被lock的object,不是认区块 06/04 21:16
5F:→ cole945:的吧.__.? 06/04 21:16