Linux程序设计第二版练习题(第八章)

1、Fibonacci序列为0,1,1,2,3……,通常,……

#include 
#include 
#include 
#include 
int arr_fib[100];
int fib(int n)
{
	if(n==0)
		return 0;
	else if(n==1||n==2)
		return 1;
	else
		return(fib(n-1)+fib(n-2));
}
void *print_fib(void *n)
{
	int i;
	int fib_num;
	for(i=0;i

4、现有4个线程R1,R2,W1和W2,它们共享可以存放一个数的缓冲器B。线程R1每次把从键盘上投入的一个数存放到缓冲器B中,供线程W1打印输出;线程R2每次从磁盘上读一个数放到缓冲器B中,供线程W2打印输出。当一个线程把数据存放到缓冲器后,再该数没有被打印输出之前不准任何线程再向缓冲器中存数。在缓冲器中还没有存入一个新的数之前不允许任何线程加快从缓冲区取出打印。编写程序……

#include 
#include 
#include 
#include 
#include 
pthread_mutex_t S;
sem_t S1,S2;
int num;
int f1=0,f2=0;
void *R1()
{
	while(1)
	{
	pthread_mutex_lock(&S);
	if(f1==0&&f2==0)
	{
		int a;
		printf("请输入一个数:");
		scanf("%d",&a);
		num=a;
		printf("R1已经向缓冲器B存放了%d\n",num);
		sem_post(&S1);
		f1=1;
	}
	pthread_mutex_unlock(&S);
	}
}
void *R2()
{
	FILE *fp=fopen("file3.dat","r");
	while(!feof(fp))
	{
	pthread_mutex_lock(&S);
	if(f2==0&&f1==0)
	{
		fscanf(fp,"%d",&num);
		printf("R2已经向缓冲器B存入%d\n",num);
		sem_post(&S2);
		f2=1;
	}
	pthread_mutex_unlock(&S);
	}
	fclose(fp);
}
void *W1()
{
	while(1)
	{
	pthread_mutex_lock(&S);
	if(f1==1)
	{
		sem_wait(&S1);
		printf("R1num=%d\n",num);
		f1=0;
	}
	pthread_mutex_unlock(&S);
	}
}
void *W2()
{
	while(1)
	{
	pthread_mutex_lock(&S);
	if(f2==1)
	{
		sem_wait(&S2);
		printf("R2num=%d\n",num);
		f2=0;
	}
	pthread_mutex_unlock(&S);
	}
}

int main()
{
	pthread_t tid1,tid2,tid3,tid4;
	pthread_mutex_init(&S,NULL);
	sem_init(&S1,0,0);
	sem_init(&S2,0,0);

	pthread_create(&tid1,NULL,R1,NULL);
	pthread_create(&tid2,NULL,R2,NULL);
	pthread_create(&tid3,NULL,W1,NULL);
	pthread_create(&tid4,NULL,W2,NULL);

	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	pthread_join(tid3,NULL);
	pthread_join(tid4,NULL);

	pthread_mutex_destroy(&S);
	sem_destroy(&S1);
	sem_destroy(&S2);
	
	return 0;
}

你可能感兴趣的:(linux)