LINUX.ORG.RU

Читатели/писатели


0

1

Класическая задача синхронизации. Есть общий ресурс, из которого можно читать и писать, есть читатели и есть писатели... Чтение может происходить несколькими нитями одновременно. Когда какая-то из нитей производит запись, остальные нити не должны иметь доступа к ресурсу.

Только небольшая нароботка, но она не работает. Скажите, пожалуйста, в чем ошибка?


#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/sem.h>
#include <sys/wait.h>
//#include <signal.h>


int readcount = 0, writecount; 
semaphore x = 1, y=1, z=1, rsem = 1, wsem = 1;


void reader() 
{ 
 while(true)
     { 
      wait(z); 
      wait(rsem);
      wait(x); 
      readcount++;
      if (readcount==1) wait(wsem); 
      signal(x); 
      signal(rsem); 
      signal(z); 
      READUNIT(); 
      wait(x);
      readcount--; 
      if (readcount==0) signal(wsem); 
      signal (x); 
      }
 } 
void writer()
 { 
   while(true)
     {
 	wait(y);
	writecount++; 
 	if (writecount==1) wait(rsem);
 	signal(y); 
	wait(wsem);
 	WRITEUNITO;
 	signal(wsem); 
	wait(y);
 	writecount--;
 	if (writecount==0) signal(rsem);
 	signal(y);
 }
 }


 void main () 
{

 readcount = writecount = 0; 
 parbegin(reader, writer);
 }

Ответ на: комментарий от Eddy_Em

И нафига столько семафоров-то?

Для надежности! Большим количеством кривых семафоров можно аппроксимировать один прямой.

Deleted ()
Ответ на: комментарий от Eddy_Em

Значит мало семафоров. Надо их в массив и повторить.

Deleted ()
Ответ на: комментарий от Eddy_Em

Весчь, нам надо такие поставить. Один хрен никуда не проехать, хоть рассматривать будет что.

ilovewindows ★★★★★ ()
Ответ на: комментарий от Eddy_Em
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/sem.h>
#include <sys/wait.h>
//#include <signal.h>


int readcount = 0, writecount; 
semaphore x = 1, y=1, z=1, rsem = 1, wsem = 1;


void reader() 
{ 
 while(true)
     { 
      wait(z); 
      //wait(rsem);
     // wait(x); 
      readcount++;
      if (readcount==1) wait(wsem); 
     // signal(x); 
      //signal(rsem); 
      signal(z); 
      READUNIT(); 
      wait(x);
      readcount--; 
      if (readcount==0) signal(wsem); 
      signal (x); 
      }
 } 
void writer()
 { 
   while(true)
     {
 	wait(y);
	writecount++; 
 	if (writecount==1) wait(rsem);
 	signal(y); 
	wait(wsem);
 	WRITEUNITO;
 	signal(wsem); 
	wait(y);
 	writecount--;
 	if (writecount==0) signal(rsem);
 	signal(y);
 }
 }


 void main () 
{

 readcount = writecount = 0; 
 parbegin(reader, writer);
 }

если так, то ничего не изменится, или я не так понял?

HUGO_GO ()
Ответ на: комментарий от HUGO_GO

Чего сделать-то надо? Где оригинал домашнего задания?

// кстати, у Стивенса в книжке был пример читателя-писателя, можешь своровать

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

полное задание-

Есть общий ресурс, из которого можно читать или писать. Необходимо реализовать задачу в виде программы с учетом следующих ограничений:

• В системе есть N потоков читателей и М потоков писателей. Они работают так: в бесконечном цикле сначала спят случайный интервал времени, потом пытаются получить доступ на чтение/запись, после получения доступа выполняют эту операцию случайный интервал времени.

• Чтение может происходить несколькими нитями одновременно, но не больше К.

• Когда какая-то из нитей производит запись, остальные нити не должны иметь доступа к ресурсу

• Время ожидания в очереди ограничено числом Т После ревышения этого времени процесс прекращает ожидание и начинает цикл своей работы сначала. Результаты работы программы должны отображаться в консоли по мере их появления, как показано ниже. Вывод должен быть синхронизированным, те. последовательность строк в логе должна соответствовать последовательности операций, выполняемых программой.

****** 12:01:10.353 Читатель 1 хочет читать. | Ресурс свободен.

HUGO_GO ()
Ответ на: комментарий от HUGO_GO

Ну так семафор на чтение == K, семафор на запись == 1, больше семафоров не надо.

И эта задачка — ну точь-в-точь стивенсовская!

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от HUGO_GO

Где вас всех учат так форматировать код? Постоянно вижу тут вопросы по C с адским стилем или отсутствием его.

anonymous ()
Ответ на: комментарий от nokachi

Ну так человек начал мьютексами — пусть хотя бы так сделает.

Eddy_Em ☆☆☆☆☆ ()

Ошибка в том, что ты пилишь свой велосипед вместо того, чтобы использовать pthread rwlocks, которые как раз решают эту задачу.

yoghurt ★★★★★ ()
Ответ на: комментарий от yoghurt

у вас был класс по операционным системам? Там эта самая первая задача на тему concurrency. Цель учебных задачек — не добиться результата, а понять как это работает и почему. То, что здесь принято называть «велосипед». Как получилось что вы сами такой велосипед не писали?

nokachi ()
Ответ на: комментарий от nokachi

А про учебную направленность ТС не говорил.

Как получилось что вы сами такой велосипед не писали?

Писал. И rwlock'и писал, и барьеры велосипедил - еще пока в OpenBSD не появилась их поддержка, а проект внедрять надо было.

yoghurt ★★★★★ ()
Ответ на: комментарий от yoghurt

ну, судя по коду что ТС привел, у меня даже сомнений не было что он делает хоумворк

nokachi ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.