Search code examples
cpthreadssemaphorereaderwriterlock

Segmentation fault in reader-writer appilication using posix semaphore in c


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);
}

Solution

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

    int i = 10;
    ....
     while (i != 5)
        pthread_create(&t[i--], NULL, writer, NULL);