Re: [問題] CreateMutex參數疑問

看板C_and_CPP作者 (我愛阿蓉)時間16年前 (2010/01/21 13:36), 編輯推噓3(3024)
留言27則, 4人參與, 最新討論串2/3 (看更多)
http://msdn.microsoft.com/en-us/library/ms686927(VS.85).aspx 不好意思請教各位 我把MSDN這範例拿來跑 http://nopaste.csie.org/57d24#form 邏輯都沒變 我只有加上自己呼叫 WriteToDatabase(0); 另外CreateMutex第二個參數設定為true 跑出來的行為讓我非常疑惑 1. 他一開始用main去create 所以onwership就是main這個thread.... 而他可以順利的跑第一次的while迴圈後 跑到 ReleaseMutex... 這時他應該已經把ownership給釋出 所以我認為thread1 和 thread2 應該會插入 近來跑 2. 執行結果卻是 main跑20圈後 卡在那邊 沒有辦法讓出ownership給thread跑 最後一圈至少都有releasemutex 不至於卡住吧?? 我觀念似乎有錯 但是又想不到合理解釋 3. 我嘗試著在106行跳出while後 在realseMutex一次 這時執行結果就變成 main thread跑完 thread1 thread2會穿插的跑 (1212121212~~~) 為啥要在release一次才有效果~而且為什麼是穿插跑 而不是1122121211之類的的情 況產生 有可能會跑幾次才換thread跑. 以上我實在不知道如何解釋 雖然看別人code似乎都是設定false... 就變成說隨便誰先都沒差了~~可是就覺得好像要搞懂才心安 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.64.222 ※ 編輯: QQ29 來自: 219.87.64.222 (01/21 13:37)

01/21 14:38, , 1F
正常執行時, __finally 是執行不到的
01/21 14:38, 1F

01/21 14:38, , 2F
所以你如果沒有在 WriteToDatabase 最後面加 ReleaseMutex
01/21 14:38, 2F

01/21 14:38, , 3F
那麼 main thread 一開始拿到的 mutex 就永遠放不出去了
01/21 14:38, 3F

01/21 14:39, , 4F
那個參數如其名, 就是 mutex 建出來之後要不要預設就先拿到
01/21 14:39, 4F

01/21 14:39, , 5F
擁有權
01/21 14:39, 5F

01/21 14:40, , 6F
合理的做法應該是一開始不拿走擁有權, 有需要時再拿
01/21 14:40, 6F

01/21 16:54, , 7F
樓上對 __finally 可能有誤解; 原po請看MSDN對
01/21 16:54, 7F

01/21 16:55, , 8F
CreateMutex 的說明, Remarks 的第5段有解答你的疑問
01/21 16:55, 8F

01/21 16:57, , 9F
finally在各個語言的意義應該都一樣 一樓有誤
01/21 16:57, 9F

01/21 16:57, , 10F
sorry 我慢了...
01/21 16:57, 10F

01/21 18:26, , 11F
請教一下k大 我看了那段 可是說真的我看不懂他表達的意思
01/21 18:26, 11F

01/21 18:26, , 12F
wait函式不就是在等mutex可以用(signaled) 而要可以用是透過
01/21 18:26, 12F

01/21 18:26, , 13F
release 但是main一開始擁有onwership, wait一開始攔不住他
01/21 18:26, 13F

01/21 18:26, , 14F
做完也有呼叫release 我覺得我中間觀念有點問題
01/21 18:26, 14F

01/21 18:27, , 15F
可否請K大講解一下@@
01/21 18:27, 15F

01/21 19:18, , 16F
我請你看第5段 你好像看到第4段去了...
01/21 19:18, 16F

01/21 19:18, , 17F
The thread that owns a mutex can specify the same
01/21 19:18, 17F

01/21 19:19, , 18F
mutex in repeated wait function calls without
01/21 19:19, 18F

01/21 19:19, , 19F
blocking its execution. 這段...
01/21 19:19, 19F

01/21 19:41, , 20F
對阿我看這段後 發現不太懂耶
01/21 19:41, 20F

01/21 19:41, , 21F
什麼specify ~不懂他表達的意思...
01/21 19:41, 21F

01/21 20:26, , 22F
簡單說.. 得到幾次就要release幾次
01/21 20:26, 22F

01/21 20:27, , 23F
你的main()從CreateMutex就得到一次, WaitForSingle..()
01/21 20:27, 23F

01/21 20:28, , 24F
又得到一次, 所以要release 2次
01/21 20:28, 24F

01/21 21:47, , 25F
我秀逗了... 請忽略我的推文 Orz
01/21 21:47, 25F

01/21 22:06, , 26F
意思就是說我create第二個參數設true就算一次了喔
01/21 22:06, 26F

01/21 22:06, , 27F
那他會交錯的輸出是運氣好嚕 剛好照順序跑thread?
01/21 22:06, 27F
文章代碼(AID): #1BL-VP1n (C_and_CPP)
文章代碼(AID): #1BL-VP1n (C_and_CPP)