Я хочу, чтобы проблема читателей / писателей с двоичным семафором - PullRequest
0 голосов
/ 28 мая 2019

У меня 5 писателей, 20 читателей. Я хочу решить проблему читателей / писателей с помощью двоичного семафора.

Но у моего кода есть некоторые проблемы. Ошибка сегментации (ядро сброшено). Я думаю, что есть проблема при создании темы. Как я могу решить проблему? и это правильный код, чтобы решить проблему R / W? Я использовал псевдокод моего учебника.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>

sem_t mutex, rw_mutex;

int data = 0;
int readcount = 0;

void *reader(void* i)
{
    int num = *((int*)i);
    sem_wait(&mutex);
    readcount += 1; 
    if(readcount == 1)
            sem_wait(&rw_mutex);
    sem_post(&mutex);

    printf("I'm reader%d, data is %d \n", num, data);
    sem_wait(&mutex);

    readcount -= 1;
    if( readcount == 0)
            sem_post(&rw_mutex);
    sem_post(&mutex);
}

void *writer(void *i)
{
      int num = *((int*)i);
      sem_wait(&rw_mutex);
      data++;
      printf("I'm writer%d, data is %d\n", num, data);
      sem_post(&rw_mutex);
}

void main()
{
      int i;
      pthread_t writer[5], reader[20];
      sem_init(&rw_mutex, 0, 1);
      sem_init(&mutex, 0, 1);

      for(i=0; i<5; i++)
              pthread_create(&writer[i], NULL, writer, &i);
      for(i=0; i<20; i++)
              pthread_create(&reader[i], NULL, reader, &i);
      for(i=0; i<5; i++)
            pthread_join(writer[i], NULL);
      for(i=0; i<20; i++)
              pthread_join(reader[i], NULL);
      printf("End \n");
}

1 Ответ

2 голосов
/ 28 мая 2019

Вы проверили предупреждения от вашего компилятора?Я получил несколько предупреждений.Один из примеров:

предупреждение: передача аргумента 3 параметра 'pthread_create' из несовместимого типа указателя [по умолчанию включено] pthread_create (& reader [i], NULL, reader и & i);

Проблема в том, что в main у вас есть массив с именем reader, но в программе также есть функция с именем reader.Таким образом, компилятор (то есть, по крайней мере, мой компилятор) использует массив, когда вам действительно нужна функция.И сбой программы.

Исправьте предупреждения!Либо путем переименования функций reader и writer, либо путем переименования массивов.

После этого я больше не вижу сбоя программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...