我一直在遇到段错误,假设它试图访问过去的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;
}