我打算實現一個程序,其中一個父進程讀取一個文本文件,並將他正在讀取的數據提供給共享內存緩衝區,該進程將被某些子進程讀取。所有這些工作都將由信號量來調節。假設父文件將從文件中一次讀取一個字符,共享內存緩衝區包含5個插槽。生產者/消費者問題
起初,我認爲僅具有2個信號量:
writeSemaphore
,初始化爲5,是它告訴作家是否允許寫到緩衝器的信號量。當它最終下降到0時,父進程將被阻塞,直到其中一個子進程解鎖(在讀取了某個塊之後)。
readSemaphore
,初始化爲0是信號量,它告訴是否允許任何閱讀器從緩衝區中讀取數據。
但現在我想起來了,這並不妨礙我讓2位消費者同時訪問共享內存。我必須阻止它。於是我介紹了第三個信號量:
allowedToRead
即1或0,允許或阻止訪問子進程。
這裏是爲兒童和家長的僞代碼:
兒童:
while (something) {
wait(readSemaphore)
wait(allowedToRead)
<<read from shared memory>>
post(allowedToRead)
post(writeSemaphore)
}
家長:
while (something) {
wait(writeSemaphore)
<<writes to shared memory>>
post(allowedToRead)
}
是我的推理是否正確?
由於
你可以找到Boost.Interprocess有用的爲您節省一些處理共享內存的繁重工作。這裏描述了直接的流程到流程結構:http://www.boost.org/doc/libs/1_45_0/doc/html/interprocess/streams.html – 2010-12-04 18:33:01
這是爲了學校,所以對我沒有任何幫助。 – 2010-12-04 18:59:59