进程通信之生产者消费者问题

题目

有四个生产者(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)

希望有大神可以指教为什么会这样

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值