[英]Read write lock with condition variables
我有一個已實現的fifo隊列,它有兩個方法add()
和remove()
都對隊列執行寫操作。 為了使其線程安全,我正在使用ReentrantLock
。 我有兩個條件:(i)如果隊列為空並嘗試刪除,則阻塞線程; (ii)如果隊列已滿並且正在嘗試添加,則阻塞線程。 現在,我想實現一個窺視操作,該操作將允許多個線程同時執行窺視,但是沒有線程能夠寫。 如果我使用ReentrantLock
我將無法實現,因為我必須獲取鎖及其互斥。 我可以在ReentrantReadWriteLock
進行窺視操作,但是它沒有我需要的條件變量。 有什么建議么?
為什么peek()
根本需要鎖?
這是不可能的peek()
給予保證正確的答案。
if (q.peek() != NULL) {
... q could be empty at this point because some other consumer
could have removed the last item after the peek() returned...
} else {
... q could be non-empty at this point because a consumer could
have added new items after the peek() returned...
}
如果只有一個使用者,peek()方法會更有用。 在這種情況下:
if (q.peek() != NULL) {
...q MUST be non-empty here, because there is no other thread that
could have removed anything from the queue...
}
當然,為什么peek()可能需要鎖定的一個原因是如果您實現了鏈接隊列。 在這種情況下,您可能需要鎖定,以防止peek()方法遵循錯誤的指針並導致程序崩潰。
如果您只是在尋找解決方案,快速解決方案是在釋放鎖之前但在每次更新之后創建一個重復的數組(隊列)。 該數組可以作為peek()的參考變量。
我不確定java在線程化期間是否支持此功能,但是您可以創建另一個變量,例如query,它是對原始隊列的引用。 這樣您就可以立即查看peek()的更新。 雖然我是Java的新手,但是大多數語言都是通過使用以下內容來實現此目的的:
query = &queue;
&符號是按引用傳遞的運算符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.