Домашнее задание - читатель напишет аппендер семафор - PullRequest
1 голос
/ 14 февраля 2012

У меня проблема с домашней работой, которую я действительно не знаю с чего начать.

Вот вопрос: «Эта проблема использует новый примитив синхронизации под названием семафор ReaderWriterAppender. Те же правила применяются куважение к читателям и писателям, как с семафором ReaderWriter, с добавлением этих новых правил для аппендера:

1) Не более одного аппендера может иметь семафор в любой момент времени.
2) Аппендири write не может одновременно владеть семафором
3) Чтение может происходить во время добавления "

Мне нужно реализовать его самостоятельно.

Существует структура, заданная

typedef struct {
   //structure here
} rwasem_t;

void rwalock_init(rwasem_t * rwa) {

}

void rwa_read_lock(rwasem_t * rwa) {

}

void rwa_write_lock(rwasem_t * rwa) {

}

void rwa_append_lock(rwasem_t * rwa) {

}

void rwa_append_unlock(rwasem_t * rwa) {

}

Проблема в том, что я не знаю, как подойти к проблеме.Я знаю, что такое семафор читателя-писателя, я знаю, как их использовать, и я использовал их раньше.Но я не знаю, как их реализовать.Они даже не говорят мне, могу ли я использовать API или что-то еще.По сути, «реализуй это»

Заранее спасибо,
Гасим

1 Ответ

2 голосов
/ 14 февраля 2012

Некоторые подсказки:

  1. Чем отличается appender и read?

  2. Что если вы просто используете блокировку чтения для appender? Назовите один случай, они разные.

  3. Можно ли добавить еще одну блокировку в корпусе приложения, чтобы предотвратить случай в (2)?

Псевдокод:

ReadWriteLock lock_a, lock_b;

void rwa_read_lock(rwasem_t * rwa) {
    lock_a.do_somethingA();
    lock_b.do_somethingB();   // is this needed?
}

void rwa_write_lock(rwasem_t * rwa) {
    lock_a.do_somethingC();
    lock_b.do_somethingD();   // is this needed?
}

void rwa_append_lock(rwasem_t * rwa) {
    lock_a.do_somethingE();
    lock_b.do_somethingF();   // is this needed?
}

что такое "do_somethingX ()"?

Важен ли порядок блокировки? Если да, то какой порядок правильный?

...