簡體   English   中英

使用C中posix信號量的讀寫器應用中的分段錯誤

[英]Segmentation fault in reader-writer appilication using posix semaphore in c

在此代碼中,寫入器遞增數據變量,而讀取器打印此數據變量。 任何時候只有一個寫入器可以寫入,但是當寫入器不在數據上寫入時,所有讀取器都可以打印數據。
附加的代碼有時會成功運行,但有時會給出分段錯誤錯誤。

讀寫器代碼

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

您訪問t[10]越界

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM