ABCABCABC
#include <string.h>
#include <pthread.h>
#include <stdio.h>
char a='A';
char b='B';
char c='C';
int flag=0;
//互斥锁
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;
void* callBack1(void* arg)
{
while(1)
{
pthread_mutex_lock(&mutex);
if(1==flag||flag==2)//条件为0不休眠
{
pthread_cond_wait(&cond1,&mutex);
}
printf("%c",a);
flag=1;
pthread_cond_signal(&cond2);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void* callBack2(void* arg)
{
while(1)
{
pthread_mutex_lock(&mutex);
if(flag==0||flag==2)//条件为1不休眠
{
pthread_cond_wait(&cond2,&mutex);
}
printf("%c",b);
flag=2;
pthread_cond_signal(&cond3);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void* callBack3(void* arg)
{
while(1)
{
pthread_mutex_lock(&mutex);
if(0==flag||flag==1)//条件为2不休眠
{
pthread_cond_wait(&cond3,&mutex);
}
printf("%c\n",c);
flag=0;
pthread_cond_signal(&cond1);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
pthread_t tid1,tid2,tid3;
//A
if(pthread_create(&tid1,NULL,callBack1,NULL)!=0)
{
perror("pthread_create");
return -1;
}
//B
if(pthread_create(&tid2,NULL,callBack2,NULL)!=0)
{
perror("pthread_create");
return -1;
}
//C
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);
pthread_cond_destroy(&cond1);
pthread_cond_destroy(&cond2);
pthread_cond_destroy(&cond3);
return 0;
}
父子进程对话
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, const char *argv[])
{
int pfd[2];//无名管道
if(pipe(pfd)<0)//判断条件,-1为创建无名管道失败
{
perror("pipe");
return -1;
}
printf("无名管道创建成功\n");
int pfd2[2];//无名管道
if(pipe(pfd2)<0)//判断条件,-1为创建无名管道失败
{
perror("pipe");
return -1;
}
printf("无名管道2创建成功\n");
char buf1[128];
int res1=0;
pid_t pid = fork();//创建子进程
if(pid > 0)
{
//父进程代码区
while(1)
{
bzero(buf1,sizeof(buf1));
printf("父进程对子进程说:");
fgets(buf1,sizeof(buf1),stdin);//父进程发送给子进程信息
buf1[strlen(buf1)-1] = '\0';
res1=write(pfd[1],buf1,sizeof(buf1));
//向管道文件写入字符串buf1
if(strcmp(buf1,"quit")==0)
{
break;
}
if(res1<0)
{
perror("write");
return -1;
}
/********************************************/
bzero(buf1,sizeof(buf1));
res1=read(pfd2[0],buf1,sizeof(buf1));
//从管道文件中读取字符串buf1
if(strcmp(buf1,"quit")==0)
{
break;
}
if(res1<0)
{
perror("read");
return -1;
}
printf("父进程:子进程说:%s\n",buf1);
}
}
else if(0==pid)
{
//子进程代码区
while(1)
{
bzero(buf1,sizeof(buf1));
res1=read(pfd[0],buf1,sizeof(buf1));
//从管道文件中读取字符串buf1
if(strcmp(buf1,"quit")==0)
{
break;
}
if(res1<0)
{
perror("read");
return -1;
}
printf("子进程:父进程说:%s\n",buf1);
/********************************************/
bzero(buf1,sizeof(buf1));
printf("子进程对父进程说:");
fgets(buf1,sizeof(buf1),stdin);//父进程发送给子进程信息
buf1[strlen(buf1)-1] = '\0';
res1=write(pfd2[1],buf1,sizeof(buf1));
//向管道文件写入字符串buf1
if(strcmp(buf1,"quit")==0)
{
break;
}
if(res1<0)
{
perror("write");
return -1;
}
}
}
else
{
//创建子进程失败
perror("fokr error");
return -1;
}
return 0;
}
本文介绍了一个使用pthread库实现线程间同步的经典案例,通过三个线程按顺序打印字符A、B、C,展示了如何利用互斥锁和条件变量来协调线程间的执行顺序。此外,还提供了一个父子进程通过无名管道进行通信的例子。
83

被折叠的 条评论
为什么被折叠?



