作者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