[問題] 我以為這樣會死結,但是卻不會!!

看板C_Sharp (C#)作者 (市政府7F)時間18年前 (2008/06/03 18:12), 編輯推噓4(401)
留言5則, 2人參與, 最新討論串1/1
各位前輩大家好 話說小弟唸到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
t2不一定會先執行呀..
06/03 19:23, 1F

06/03 23:58, , 2F
lock只保證多執行緒不會進入同一區塊,但不保證順序
06/03 23:58, 2F

06/03 23:58, , 3F
假如t1/t2執行緒跑不同區塊,lock(this)也是沒用的。
06/03 23:58, 3F

06/04 21:16, , 4F
不同區塊有用吧.__." lock是認被lock的object,不是認區塊
06/04 21:16, 4F

06/04 21:16, , 5F
的吧.__.?
06/04 21:16, 5F
文章代碼(AID): #18HHZvuB (C_Sharp)
文章代碼(AID): #18HHZvuB (C_Sharp)