我有共享内存,x作者,y读者,一个父进程。作家有独家访问权限,因此一位作家可以写作,其他读者和作者必须等待。多个读者可以并行读取。优先考虑的是编写者,例如,如果3个读者正在阅读,而一个作者想要写入共享内存,那么当这3个读者完成他们的工作时,没有更多的读者可以阅读,写作者可以写。我不知道如何通过信号量实现它,因为读者可以读取并行,所以下一个代码将无法工作,因为所有读者都将在该信号量中等待。
//reader
if(isWriterActive())
{
sem_wait(semReaderStop);
}
//writer
sem_wait(semReaderStop());
.
.
sem_post(semReaderStop());
我认为这样的事情并不好,因为它没有阻止。
//readers doJob
if(isWriterActive())
{
return E_WRITER_ACTIVE;
}
while(doJob()==E_WRITER_ACTIVE);
答案 0 :(得分:1)
你需要一个Pthreads读/写锁 - Linux NPTL上的编写器饥饿有一些背景here。
答案 1 :(得分:0)
您的问题是经典生产者/消费者问题的变体(没有给定的读/写操作同步约束)。以下伪代码允许必须解决您的问题:
// globals
semaphore writers = 1; // "binary semaphore"
semaphore readers = 1; // "counting semaphore"
void writer() {
sem_wait(writers); // wait until there's no writers
sem_wait(readers); // wait until there's no readers
// safe write context: no-one else can read nor write
sem_post(readers); // signal other readers can run
sem_post(writers); // signal other writers can run
}
void reader() {
sem_wait(writers); // wait until there's no writers
sem_post(readers); // there's one more reader active
// safe read context: others can read, but no-one else can write
sem_wait(readers); // this reader is completed
sem_post(writers); // signal other writers can run
}
有关同步的详细信息,请参阅此lecture,但我建议您在线阅读有关Dijkstra Semaphores的更多信息或使用Tanenbaum Modern Operating Systems这样的好书。