0

In this code, writer increment data variable and reader print this data variable. Only one writer can write any time but all reader can print data when the writer is not writing on data.
The attached code run sometimes successfully but sometimes it gives segmentation fault error.

Reader-writer code

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

int reader_count;
int data = 10; /* data on which writer write update & reader read */

/* sem_write: to isolate reader & writer thread */
sem_t sem_write;
/* sem_read: to increment reader counter & sem_write */
sem_t sem_read;


void *writer(void *arg);
void *reader(void *arg);

int main(void)
{
    pthread_t t[10];
    int i = 10;

    if (sem_init(&sem_read, 0, 1)) 
        exit(1);
    if (sem_init(&sem_write, 0, 1)) 
        exit(1);

    /* 5 writer create */
    while (i != 5)
        pthread_create(&t[i--], NULL, writer, NULL);
    /* 5 reader create */
    while (i)
        pthread_create(&t[i--], NULL, reader, NULL);

    /* wait for all threads to completed */
    while (i != 10)
        pthread_join(t[i++], NULL);

    sem_destroy(&sem_read);
    sem_destroy(&sem_write);
    return 0;
}

void *writer(void *arg)
{
    sem_wait(&sem_write);
    sleep(1);   /* writing work */
    data++;
    sem_post(&sem_write);
    pthread_exit(NULL);
}

void *reader(void *arg)
{
    sem_wait(&sem_read);
    reader_count++;
    if (reader_count == 1)
        sem_wait(&sem_write);
    sem_post(&sem_read);

    sleep(1);   /* reading work */
    printf("Data: %d\n", data);

    sem_wait(&sem_read);
    reader_count--;
    if (!reader_count)
        sem_post(&sem_write);
    sem_post(&sem_read);
    pthread_exit(NULL);
}
Community
  • 1
  • 1
Gaurang Rathod
  • 13
  • 1
  • 1
  • 5
  • 1
    Undefined behavior for data race due to unsynchronized, non-readonly, non atomic access to an object from multiple threads. – EOF Nov 03 '17 at 07:28

1 Answers1

1

You are going out of bounds while accessing t[10]

int i = 10;
....
 while (i != 5)
    pthread_create(&t[i--], NULL, writer, NULL);
Gaurav Sehgal
  • 7,422
  • 2
  • 18
  • 34