我打算实现一个程序,其中一个父进程读取一个文本文件,并将他正在读取的数据提供给共享内存缓冲区,该进程将被某些子进程读取。所有这些工作都将由信号量来调节。假设父文件将从文件中一次读取一个字符,共享内存缓冲区包含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