我遇到了實現簡單工作隊列的麻煩。做一些分析,我面臨一個微妙的問題。工作隊列由常規鏈接列表支持。代碼看起來是這樣的(簡化):實施簡單工作隊列的問題
0. while (true)
1. while (enabled == true)
2. acquire lock on the list and get the next action to be executed (blocking operation) (store it in a local variable)
3. execute the action (outside the lock on the list on previous line)
4. get lock on this work queue
5. wait until this work queue has been notified (triggered when setEnabled(true) has been callled)
所述的setEnabled(e)中的操作是這樣的(簡化):
enabled = e
if (enabled == true)
acquire lock on this work queue and do notify()
雖然此方法有效,存在其中發生死鎖的情況。它發生在以下罕見的情況:在步驟(3)在正在執行的行動,的setEnabled
- (假)被稱爲
- 之前(4)輸入步驟,的setEnabled(真)被稱爲
- 現在步驟(5)繼續等待永遠,因爲這個工作隊列已經被通知,但我們錯過了
如何解決這個問題?我一直在看這個一段時間,但我無法想出一個解決方案。
請注意我對線程同步相當陌生。
非常感謝。
您正在使用特定語言嗎?例如,.NET語言已經完成了大部分工作。 – ChaosPandion 2010-05-08 20:23:00
我在只支持Java 1.1的移動設備上使用Java進行此操作。我不僅對解決方案感興趣(因爲我可以輕鬆地谷歌和下載一些圖書館),但我想知道我做錯了什麼。我從來沒有真正深入過線,我認爲這是一個提高自己的好機會。 – 2010-05-08 20:25:57