题目
有四个生产者(producer)和三个消费者(customer),生产者从文件中读取内容,然后存放到缓存区中,消费者从缓存区中获取内容
代码
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
//作为缓冲区
char buffer[10];
void producer(int name);
void customer(int name);
//线程锁
//full:customer使用,使同时只有一个customer开始运行
//empty:producer使用,使同时只用一个producer开始运行
//mutex:共同使用,使同时只用一个进程在使用缓冲区
pthread_mutex_t mutex,empty,full;
//标识缓冲区已经被使用的个数
int s;
int main(void){
pthread_t pd[4],ct[3];
int i,j;
for(i=0;i<10;i++){
buffer[i]='\n';
}
pthread_mutex_init(&mutex,NULL);
pthread_mutex_init(&empty,NULL);
pthread_mutex_init(&full,NULL);
for(i=0;i<4;i++){
j=pthread_create(&pd[i],NULL,(void *) producer,i);
if(j!=0){
printf("Create producer%d error\n",i);
exit(1);
}else{
printf("Create producer%d succeed!\n",i);
}
}
for(i=5;i<8;i++){
j=pthread_create(&ct[i-5],NULL,(void *)customer,i);
if(j!=0){
printf("Create customer%d error\n",i);
exit(1);
}else{
printf("Create customer%d sucess\n",i);
}
}
for(i=0;i<4;i++){
pthread_join(pd[i],NULL);
}
for(i=5;i<8;i++){
pthread_join(ct[i-5],NULL);
}
return 0;
}
void customer(int name){
FILE *file;
int i,j;
char a;
//customer将从缓冲区读取的内容存入该文件
file = fopen("/homework2/ProducerAndCustomer/writer.text","w");
//线程进行消费操作62次
for(i=0;i<62;i++){
int try;
printf("%d want to use full\n",name);
//尝试获取两个线程,如果无法获取,等一秒后继续尝试,知道可以获取
while(1){
try = pthread_mutex_trylock(&full);
if(try!=0){
printf("%d can't use full.\n",name);
sleep(1);
}else{
printf("%d start use full\n",name);
break;
}
}
while(1){
try=pthread_mutex_trylock(&mutex);
if(try!=0){
printf("%d can't use mutex\n",name);
sleep(1);
continue;
}else{
printf("%d start use mutex.\n",name);
//在缓冲区寻找可以消费的目标
if(s>0){
for(j=0;j<10;j++){
if(buffer[j]!='\n')
break;
}
a=buffer[j];
s--;
buffer[j]='\n';
fputc(a,file);
printf("%d write %c into file.\n",name,a);
break;
}else{
//如果获取mutex后发现缓冲区空,则归还mutex后等一秒,再重新尝试获取和消费
pthread_mutex_unlock(&mutex);
printf("%d stop using mutex.\n",name);
sleep(1);
continue;
}
}
}
pthread_mutex_unlock(&mutex);
pthread_mutex_unlock(&full);
sleep(1);
}
if(fclose(file)==0){
printf("%d stop writing\n",name);
}
}
void producer(int name){
FILE *file;
int i,j;
char a;
file = fopen("/homework2/ProducerAndCustomer/reader.text","r");
printf("%c has read the file\n",name);
//运行到文件内容全部读取
//获取锁和读取内容并写到缓冲区的过程与customer相同
while((a=fgetc(file))!=EOF){
int try;
printf("%d want to use empty.\n",name);
while(1){
try=pthread_mutex_trylock(&empty);
if(try!=0){
printf("%d can't use empty.\n",name);
sleep(1);
}else{
printf("%d start use empty!\n",name);
break;
}
}
while(1){
try=pthread_mutex_trylock(&mutex);
if(try!=0){
printf("%d can't use mutex.\n",name);
sleep(1);
continue;
}else{
printf("%d start use mutex.\n",name);
if(s<10){
for(i=0;i<10;i++){
if(buffer[i]=='\n')
break;
}
buffer[i]=a;
printf("%d read %c from file.\n",name,a);
s++;
break;
}else{
pthread_mutex_unlock(&mutex);
printf("%d stop using mutex\n",name);
sleep(1);
continue;
}
}
}
pthread_mutex_unlock(&mutex);
pthread_mutex_unlock(&empty);
sleep(1);
}
if(fclose(file)==0){
printf("%d stop reading\n",name);
}else{
printf("%d can't stop reading\n",name);
}
}
问题
在使用pthread_create函数的使用,最后一个参数负责给线程传递参数,但是发现可以传递int类型,但是不可以传递char类型。传递char类型会报错:
Segmentation fault (core dumped)
希望有大神可以指教为什么会这样