Segmentation fault (core dumped)关于线程问题

#include
#include
#include
#define NUM 200
int stack[NUM][2]; //公共缓冲区
int size=0; //初始化数组索引
sem_t sem1,sem2,sem3,sem4; //定义四个信号量
void read1(void){ //线程运行函数,负责从文件读取数据
FILE fp=fopen("data0.txt","r"); //以只读方式打开文件data1
while(!feof(fp)){
sem_wait(&sem1); //减少信号量sem1
if(!fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]))return;
size++; //读两个数到公共缓冲区
sem_post(&sem2); //增加信号量sem2
}
fclose(fp); //关闭文件
}
void read2(void){ //线程运行函数,负责从文件读取数据
FILE *fp=fopen("data1.txt","r"); //以只读方式打开文件data2
while(!feof(fp)){
sem_wait(&sem2); //减少信号量sem2
if(!fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]))return;
size++; //读两个数到公共缓冲区
sem_post(&sem3); //增加信号量sem3
}
fclose(fp);
}
void plus1(void){ //线程运行函数,负责加运算
while(1){
sem_wait(&sem3); //减少信号量sem3
if(size==0){return;}
size--;
printf("Plus:%d+%d=%d\n",stack[size][0],stack[size][1],stack[size][0]+stack[size][1]); //从公共缓冲区取数并进行加运算
sem_post(&sem4); //增加信号量sem3
}
}
void multi2(void){ //线程运行函数,负责乘运算
while(1){
sem_wait(&sem4); //减少信号量sem4
if(size==0){return;}
size--;
printf("Multiply:%d
%d=%d\n",stack[size][0],stack[size][1],stack[size][0]*stack[size][1]); //从公共缓冲区取数并进行乘运算
sem_post(&sem1); //增加信号量sem3
}
}
int main(void){
pthread_t t1,t2,t3,t4; //定义线程标识符
sem_init(&sem1,0,1); //初始化信号量
sem_init(&sem2,0,0);
sem_init(&sem3,0,0);
sem_init(&sem4,0,0);
pthread_create(&t1,NULL,(void *)read1,NULL); //创建线程,绑定线程运行函数
pthread_create(&t2,NULL,(void *)read2,NULL);
pthread_create(&t3,NULL,(void *)plus1,NULL);
pthread_create(&t4,NULL,(void *)multi2,NULL);
pthread_join(t1,NULL); //等待线程运行结束
}

http://blog.csdn.net/yam_killer/article/details/7970163