【发布时间】:2010-12-04 18:16:04
【问题描述】:
我将实现一个程序,其中一个父进程读取一个文本文件并将他正在读取的数据提供给一个共享内存缓冲区,该缓冲区将由一些子进程读取。所有这些工作都将由信号量介导。假设父级一次要从文件中读取一个字符,并且共享内存缓冲区包含 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 有助于为您节省一些处理共享内存的繁重工作。这里描述了直接的进程到进程流结构:boost.org/doc/libs/1_45_0/doc/html/interprocess/streams.html
-
这是给学校的,所以对我没有任何帮助。
标签: multithreading unix fork semaphore shared-memory