首页 > 解决方案 > PThread 分段错误,增量器/减量器

问题描述

我不断收到 Seg Fault,我假设它试图访问过去不退出的 DECREMENTORS 4。

我添加了几个打印语句来帮助缩小问题范围。

我试图创建的是线程和变量的简单递增、递减程序。

我也考虑过使用结构来存储变量,但是我不确定这是否是一个好主意。

/* readerswriters.c */
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

#define READERS 10
#define INCREMENTORS 5
#define DECREMENTORS 4

sem_t s;
int sum = 0;
int counter = 0;
int total = 0;

void *incrementorfunc(void *arg)
{
    int *me;

    me = (int *)arg;
    sem_wait(&s);
    sum++;
    printf("Incrementor %d set sum = %d\n", *me, sum);
    sem_post(&s);

    pthread_exit(NULL);
}


void *decrementorfunc(void *arg)
{

    int *me;
    me = (int *) arg;

    //Problem is in here i believe
    sem_wait(&s);
    sum--;
    printf("Decrementor %d set sum = %d\n", *me, sum);
    sem_post(&s);

    //printf("hello\n");
    pthread_exit(NULL);

}

int main(void)
{
    int i;
    pthread_t iID[INCREMENTORS];
    int increID[INCREMENTORS];

    pthread_t dID[DECREMENTORS];
    int decreID[DECREMENTORS];

    counter = 0;

    for(i = 0; i < INCREMENTORS; i++){
        increID[i] = i;
    }
    for(i = 0; i < DECREMENTORS; i++){
        decreID[i] = i;
    }
    sem_init(&s, 0, 1);

    for(i = 0; i < INCREMENTORS; i++){
        pthread_create(&iID[i], NULL, incrementorfunc, (void *)&increID[i]);
    }
    for(i = 0; i < DECREMENTORS; i++){
        pthread_create(&dID[i], NULL, decrementorfunc, (void *)&decreID[i]);
    }

    for(i = 0; i< INCREMENTORS; i++){
        pthread_join(increID[i], NULL);
    }

    for(i = 0; i < DECREMENTORS; i++){
        pthread_join(decreID[i], NULL);

    }
    return 0;
}

标签: segmentation-faultpthreadsincrementdecrementpthread-join

解决方案


推荐阅读