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$