完全披露:虽然这不是一个课程,但它是一个简单的例子,与我之前的作业(现在通过)有关。
考虑使用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同步设备,这种方式我还没有理解。是否有类似于单独进程的条件变量?还是另一种直截了当的方法来实现这个目标?
答案 0 :(得分:2)
你需要两个信号量。每个进程都使用其信号量,并向合作伙伴发出信号:
initialize sem EMPTY to 1
initialize sem FULL to 0
consumer:
loop:
sem_wait(FULL)
consume data
sem_post(EMPTY)
producer:
loop:
sem_wait(EMPTY)
produce data
sem_post(FULL)