【发布时间】:2017-09-01 19:27:45
【问题描述】:
完全披露:虽然这不是针对课程的,但它是一个简化示例,与我在之前的作业中遇到的问题(现已通过)有关。
考虑使用 POSIX 共享内存在两个进程之间传输文件。生产者进程共享从文件中读取的内容,并将其按块写入共享内存区域;消费者进程从该区域读取一大块字节并将其写出(例如,写入文件)。起初我尝试了一种简单的同步方法——只是在信号量中锁定对共享内存的访问——但当然,这允许一次写入/读取进行多次读取/写入。
我想我已经找到了一种方法来做到这一点,即使用第二个共享内存区域来阻止对读取器或写入器的访问,具体取决于其当前值。然后,在伪代码中:
before request begins:
initialize shared memory region SHM
initialize synchronization region SHM2 = "0"
initialize sem
consumer:
loop until total bytes read = file length:
while (SHM2 == "0" [lock access to SHM2 while checking]):
wait
read N bytes from SHM
write N bytes to file
sem_wait(sem)
set SHM2 = "0"
sem_post(sem)
producer:
loop until total bytes written = file length:
while (SHM2 == "1" [lock access to SHM2 while checking]):
wait
read N bytes from file
send N bytes to shared memory
sem_wait(sem)
set SHM2 = "1"
sem_post(sem)
但这似乎很笨拙。我正在尝试以某种方式避免在等待其他进程时旋转,也许有一些方法可以以我没有想到的方式使用 POSIX 同步工具。对于单独的进程,是否有类似条件变量的东西?还是另一种直接的方法?
【问题讨论】:
标签: c multiprocessing semaphore shared-memory pseudocode