Суть такова. Есть два класса объектов - читатели и писатели. Необходимо осуществить их совместный доступ к разделяемому ресурсу по следующей схеме: читатели могут одновременно читать ресурс до тех пор, пока не появился хотя бы один писатель. При появлении писателя все вновь прибывающие читатели разбегаются в ужасе блокируются до тех пор, пока писатель не закончит работу. Если на момент появления писателя уже происходило чтение несколькими читателями, то сам писатель блокируется до тех пор, пока последний незаблокированный читатель не закончит читать. Писать одновременно имеет право только один писатель (логично). Важное условие: синхронизацию необходимо осущетвить с помощью мьютексов.
Решение на Си, в котором (где-то) определен тип mutex и функции void lock(mutex *), void unlock(mutex *):
static mutex WR; /* где-нибудь инициализируется заранее */
static mutex R; /* аналогично */
static int locked = 0;
static int countR = 0;
void Read(void){
/* читатели */
int flag = 0;
lock(R);
countR++;
if(!locked){ lock(RW); flag=1; }
unlock(R);
/* ... некое чтение ресурса ... */
lock(R);
countR--;
if(flag){ locked = 0; unlock(RW); }
unlock(R);
}
void Write(void){
/* писатели */
int weHaveReaders;
do{
lock(R);
if(countR > 0) weHaveReaders = 1;
else {
locked = 0;
unlock(R);
lock(RW);
weHaveReaders = 0;
}
}while(weHaveReaders);
/* ... некая запись того же ресурса ... */
lock(R);
unlock(RW);
locked = 0;
unlock(R);
}
Вопросы: корректно ли решение? Как бы вы решили эту задачу?
Спасибо за внимание.