東西我沒有得到有關的經典算法的生產者 - 消費者問題(維基百科:)多線程:經典的生產者消費者算法
semaphore mutex = 1 semaphore fillCount = 0 semaphore emptyCount = BUFFER_SIZE procedure producer() { while (true) { item = produceItem() down(emptyCount) down(mutex) putItemIntoBuffer(item) up(mutex) up(fillCount) } up(fillCount) //the consumer may not finish before the producer. } procedure consumer() { while (true) { down(fillCount) down(mutex) item = removeItemFromBuffer() up(mutex) up(emptyCount) consumeItem(item) } }
我注意到,生產者和消費者都鎖定「互斥」之前與緩衝區混合,然後解鎖。如果是這種情況,即任何時候只有一個線程訪問緩衝區,我真的不知道上面的算法與簡單的解決方案有什麼區別,只需要在緩衝區中放置一個守護互斥體:
semaphore mutex = 1 procedure producer() { while (true) { item = produceItem() flag = true while (flag) { down(mutex) if (bufferNotFull()) { putItemIntoBuffer(item) flag = false } up(mutex) } } } procedure consumer() { while (true) { flag = true while (flag) { down(mutex) if (bufferNotEmpty()) { item = removeItemFromBuffer() flag = false } up(mutex) } consumeItem(item) } }
唯一我能想到的,需要使用'fillCount'和'emptyCount'信號量是調度。
也許第一個算法是爲了確保在5個消費者正在等待一個空的緩衝區的狀態下(零'fillCount'),可以確定的是,當一個新的生產者出現時,它會經過它的「down (emptyCount)「語句,並快速獲取'互斥量'。
(而在另一種解決方案中,消費者將不必要地獲得'互斥',直到新生產者獲得它並插入項目爲止)。
我對不對?我錯過了什麼嗎?
感謝您的快速回復。因此,當使用正確的算法時,我需要依賴up(),down()操作而不是處理CPU ......我的意思是這種算法的前提是這些操作神奇地不這樣做,不是嗎? – bloodcell 2010-10-30 12:14:59
是的,算法取決於這樣一個事實,如果信號量爲零,那麼'down()'操作會使調用它的線程進入休眠狀態,直到有人在相同的信號量上調用up()。 – 2010-10-30 12:17:41