[問題] 我以為這樣會死結,但是卻不會!!
各位前輩大家好
話說小弟唸到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
推
06/03 19:23, , 1F
06/03 19:23, 1F
推
06/03 23:58, , 2F
06/03 23:58, 2F
推
06/03 23:58, , 3F
06/03 23:58, 3F
推
06/04 21:16, , 4F
06/04 21:16, 4F
→
06/04 21:16, , 5F
06/04 21:16, 5F
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章