2014-02-25 65 views
0

如果有1個生產者,1個消費者和> 1大小的緩衝區需要插入互斥鎖?是否需要刪除互斥鎖?什麼時候生產者/消費者問題需要互斥鎖?

如果有1個生產者,1個消費者和1個大小的緩衝區需要插入互斥量?是否需要刪除互斥鎖?

如果有> 1個生產者,> 1個消費者和1個大小的緩衝區需要插入互斥量?是否需要刪除互斥鎖?

有人可以解釋你如何回答這些問題。我知道兩個線程在寫入時不應從緩衝區中讀取,但這並不意味着所有的場景都需要兩個互斥體?

編輯:從教授的第一個案例得到的答案是,第二個兩個都沒有,因爲當緩衝區非空時,相當於一個完整的緩衝區。當緩衝區爲空時,用戶被阻止。當緩衝區包含一個項目時,製作者被阻止。因此互斥被淘汰使用互斥體。

+1

這聽起來像作業。看起來你需要自己找出答案,這就是你如何獲得理解。 – Barmar

+0

@Barmar是的,它是一個功課問題。我只是不認爲我的答案始終需要互斥是正確的。我只是想要一點點的指導。 – Mehran

+0

如果你已經發布了你的答案,解釋了爲什麼你認爲它是正確的,然後問你爲什麼錯了,那會更合適。雖然也許cs.stackexchange.com會是一個更適合討論的地方。 – Barmar

回答

1

考慮以下鏈表隊列pop方法:

Object pop() { 
    if(this.head != null) { 
     Node n = this.head; 
     this.head = n.next; 
     return n.data; 
    } 
    return null; 
} 

這種方法不是線程安全的。考慮如果線程在執行第3行後暫停,另一個線程調用pop,會發生什麼情況;兩個線程都會得到相同的對象。

互斥確保兩個線程不能同時訪問同一資源,從而抵禦這種「競爭條件」。通過確保一次只有一個線程可以彈出一個元素,隊列的一致性得以保持。

可以在不使用互斥鎖的情況下實現一個隊列(例如,Java's ConcurrentLinkedList),但要困難得多。