22081-10-14 IO进程线程

1、创建ABC三个线程,要求ABC线程顺序运行,不考虑退出条件。 提示:用三个条件变量

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
//创建互斥锁
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
//创建条件变量
pthread_cond_t cond1=PTHREAD_COND_INITIALIZER;
pthread_cond_t cond2=PTHREAD_COND_INITIALIZER;
pthread_cond_t cond3=PTHREAD_COND_INITIALIZER;

int flag=0;
void *callback1(void *arg)//线程1
{
	while(1)
	{
		//上锁
		pthread_mutex_lock(&mutex);
		//休眠
		if(0!=flag)
		{
			pthread_cond_wait(&cond1,&mutex);
		}
		printf("this is thread1\n");
		sleep(1);
		flag=1;
		pthread_cond_signal(&cond2);
		//解锁
		pthread_mutex_unlock(&mutex);
	}
}
void *callback2(void *arg)//线程2
{	
	while(1)
	{
		//上锁
		pthread_mutex_lock(&mutex);
		if(1!=flag)
		{
			pthread_cond_wait(&cond2,&mutex);
		}
		printf("this is thread2\n");
		sleep(1);
		flag=2;
		pthread_cond_signal(&cond3);
		//解锁
		pthread_mutex_unlock(&mutex);
	}

}
void *callback3(void *arg)//线程3;
{	
	while(1)
	{
		//上锁
		pthread_mutex_lock(&mutex);
		if(2!=flag)
		{
			pthread_cond_wait(&cond3,&mutex);
		}
		printf("this is thread3\n");
		sleep(1);
		flag=0;
		pthread_cond_signal(&cond1);
		//解锁
		pthread_mutex_unlock(&mutex);
	}

}
int main(int argc, const char *argv[])
{
	//创建线程1
	pthread_t tid1;
	if(pthread_create(&tid1,NULL,callback1,NULL)!=0)
	{
		perror("pthread_create");
		return -1;
	}
	//创建线程2
	pthread_t tid2;
	if(pthread_create(&tid2,NULL,callback2,NULL)!=0)
	{
		perror("pthread_create");
		return -1;
	}
	//创建线程3
	pthread_t tid3;
	if(pthread_create(&tid3,NULL,callback3,NULL)!=0)
	{
		perror("pthread_create");
		return -1;
	}
	//阻塞
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	pthread_join(tid3,NULL);
	//销毁锁
	pthread_mutex_destroy(&mutex);
	return 0;
}

 

//运行结果

ubuntu@ubuntu:1014$ gcc 01_cond.c -pthread
ubuntu@ubuntu:1014$ ./a.out
this is thread1
this is thread2
this is thread3
this is thread1
this is thread2
this is thread3
^C
ubuntu@ubuntu:1014$ 

2、创建父子进程,实现父子进程的通话。

         1)父进程先发送一句话给子进程,子进程接收打印。

         2)子进程发送与句话给父进程,父进程接收后打印。

         3)重复1)2)步骤即可。

         4)当父进程或者子进程发送quit后,父子进程均要结束。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, const char *argv[])
{
	//创建管道1
	int pfd1[2];
	if(pipe(pfd1)<0)
	{
		perror("pipe");
		return -1;
	}
	printf("无名管道1创建成功 r=%d w=%d\n",pfd1[0],pfd1[1]);

	//创建管道2
	int pfd2[2];
	if(pipe(pfd2)<0)
	{
		perror("pipe");
		return -1;
	}
	printf("无名管道2创建成功 r=%d w=%d\n",pfd2[0],pfd2[1]);

	ssize_t ret;
	ssize_t res;
	char buf1[128]="";
	char buf2[128]="";
	//创建子进程
	pid_t pid=fork();
	//父进程
	if(pid>0)
	{
		
		while(1)
		{
			bzero(buf1,sizeof(buf1));
			printf("父进程说:");
			scanf("%s",buf1);
			getchar();

			//父进程写数据到管道1
			ret=write(pfd1[1],buf1,sizeof(buf1));
			if(ret<0)
			{
				perror("write-parent");
				return -1;
			}
			if(strcmp(buf1,"quit")==0)
			{
				break;
			}

		//	printf("父进程写入成功\n");

			//父进程从管道2读取数据
			bzero(buf2,sizeof(buf2));
			res=read(pfd2[0],buf2,sizeof(buf2));
			if(res<0)
			{
				perror("read-parent");
				return -1;
			}
			if(strcmp(buf2,"quit")==0)
			{
				break;
			}
			printf("父进程打印:%s\n",buf2);
		}
		wait(NULL);
		close(pfd1[1]);
		close(pfd2[0]);
		exit(0);
	}
	//子进程
	else if(pid==0)
	{

		while(1)
		{
			//子进程从管道1读取数据
			bzero(buf1,sizeof(buf1));
			ret=read(pfd1[0],buf1,sizeof(buf1));
			if(ret<0)
			{
				perror("read-child");
				return -1;
			}
			if(strcmp(buf1,"quit")==0)
			{
				break;
			}
			printf("子进程打印:%s\n",buf1);
			
			//子进程写数据到管道2
			bzero(buf2,sizeof(buf2));
			printf("子进程说:");
			scanf("%s",buf2);
			getchar();
			res=write(pfd2[1],buf2,sizeof(buf2));
			if(res<0)
			{
				perror("write-child");
				return -1;
			}
			if(strcmp(buf2,"quit")==0)
			{
				break;
			}
	//		printf("子进程写入成功\n");


		}
		close(pfd1[0]);
		close(pfd2[1]);
		exit(0);
	}
	else
	{
		perror("fork");
		return -1;
	}
	return 0;
}
//运行结果

ubuntu@ubuntu:1014$ gcc 02_pic.c 
ubuntu@ubuntu:1014$ ./a.out
无名管道1创建成功 r=3 w=4
无名管道2创建成功 r=5 w=6
父进程说:你好
子进程打印:你好
子进程说:开心
父进程打印:开心
父进程说:quit
ubuntu@ubuntu:1014$ ./a.out
无名管道1创建成功 r=3 w=4
无名管道2创建成功 r=5 w=6
父进程说:hello
子进程打印:hello
子进程说:quit
ubuntu@ubuntu:1014$ 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值