【问题标题】:Synchronization of acces to shared memory同步访问共享内存
【发布时间】:2012-04-30 14:06:49
【问题描述】:

我有共享内存、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);

【问题讨论】:

标签: c linux unix synchronization semaphore


【解决方案1】:

您需要一个 Pthreads 读取器/写入器锁 - 在 Linux NPTL 上存在写入器饥饿问题的一些背景 here

【讨论】:

【解决方案2】:

您的问题是经典生产者/消费者问题的变体(没有给定的读/写操作同步约束)。下面的伪代码可以解决你的问题:

// 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 这样的好书。

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 2021-11-26
    • 2012-12-31
    • 2019-03-04
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    相关资源
    最近更新 更多