2010-07-29 100 views
1

如果我鎖定了2個互斥體,並且每個互斥體都有一個condvar,有沒有簡單的方法可以等待或者 condvar發射?我想再次拿着兩把鎖,並且(至少)其中一個已經發出了信號。兩個互斥體condvar

回答

0

重新設計?不太瞭解你想做什麼:嘗試使用一個互斥體和多個condvars。如果你想等待condvar做出第三個condvar,當第一個或第二個被觸發時(或類似的東西)就會被觸發。

+0

不幸的是,這是一個測試,我不能真正得到其中一個互斥體。我想我會繼續嘲笑更多的東西,直到我下降到一個互斥量。 – 2010-07-29 18:24:42

1

沒有簡單的方法,我可以看到,我會創建第三個condvar和mutex,因爲你真的在等待不同的條件。

0

不可以。您最終會遇到競爭狀況。假設兩個信號都在pthread_cond_wait返回之前發送。一個人會被扔掉,而他們無法區分。

正如盧克所言,另一種思考方式是發生兩種不同的情況。當您收到信號時,請仔細檢查情況。如果有兩個條件,如果其他條件可能在您檢查時發生變化,則顯然會出現競爭狀態。

解決方案是有兩個不同的線程。如果這些線程需要獨佔,請使用另一個鎖來同步它們。

0

只需編寫完全符合您需要的同步功能即可。這樣做並沒有什麼內建的,但寫起來非常簡單。

一種方法是擁有一個主等待表,由它自己的互斥鎖保護。等待,您分配一個新的條件變量和新的等待對象。用等待的內容和新的條件變量填寫等待對象。您獲取主等待表互斥量,將您的對象添加到主等待表中,並阻止您自己的條件變量。要發出信號,你需要改變謂詞是什麼,獲得主等待表上的互斥量,查看哪些線程符合條件,併發出每個專用條件變量的信號。

在喚醒時,您必須獲取單個互斥鎖並重新檢查單個謂詞。它不會自動完成。

但最有可能的是,正確的解決方案是重新設計。最合乎邏輯的重新設計 - 爲什麼一個線程等待兩種不同的條件?如果有兩件事情可能發生,兩件事情發生時需要做兩件事情,那麼爲什麼一個線程做這兩件事?

通常,最好的設計更改是沒有線程等待這些事情。相反,當需要完成工作時,讓發現需要完成工作的條件的線程將工作項添加到隊列中。然後工作線程可以等待作業放置在該隊列中。如果需要處理兩個不同的條件,則可以由任何線程完成兩個作業。