实现AB进程对话。
1. A进程发送一-句话后, B进程接收到打印。然后B进程发送一句话,A进程接收后打印
2.重复上述步骤。直到AB接收或者发送完quit后, 结束AB进程
A文件
#include <func.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, const char *argv[])
{
if(mkfifo("./fifo" ,0664) < 0)
{
// printf("errno= %d\n", errno);
if(errno != 17)
{
perror("mkfifo");
return -1;
}
}
printf("mkfipo success\n");
ssize_t dir = 0;
ssize_t dev = 0;
char arr[128];
char brr[128];
while(1)
{
int fp = open("./fifo", O_WRONLY);
//写入
fgets(arr, sizeof(arr), stdin);
arr[strlen(arr)-1] = '\0';
dir = write(fp, arr, sizeof(arr));
if(strcmp(arr, "quit") == 0)
{
printf("退出\n");
break;
}
close(fp);
//接收
fp = open("./fifo", O_RDONLY);
dev = read(fp, brr, sizeof(brr));
if(dev == 0)
{
printf("b文件退出\n");
break;
}
printf("wdonly:%s\n", brr);
close(fp);
}
return 0;
}
B文件
#include <func.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, const char *argv[])
{
if(mkfifo("./fifo" ,0664) < 0)
{
// printf("errno= %d\n", errno);
if(errno != 17)
{
perror("mkfifo");
return -1;
}
}
printf("mkfipo success\n");
ssize_t dev = 0;
ssize_t dir = 0;
char arr[128];
char brr[128];
while(1)
{
int fp = open("./fifo", O_RDONLY);
//接受文件
dev = read(fp, arr, sizeof(arr));
if(dev == 0)
{
printf("b文件退出\n");
break;
}
printf("wdonly:%s\n", arr);
close(fp);
//写入传入b文件
fp = open("./fifo", O_WRONLY);
fgets(brr, sizeof(brr), stdin);
arr[strlen(brr)-1] = '\0';
dir = write(fp,brr, sizeof(brr));
if(strcmp(brr, "quit") == 0)
{
printf("退出\n");
break;
}
close(fp);
}
return 0;
}
现象
1.有三个线程,ID号分别为ABC,且每个线程中都在循环打印自己的ID。要求打印的结果为ABC。
#include <func.h>
#include <stdio.h>
char buf[3] = {'A', 'B', 'C'};
int flag = 0;
pthread_mutex_t mutex;
pthread_cond_t cond;
pthread_cond_t cond1;
pthread_cond_t cond2;
void * callbakc(void * arg)
{
while(1)
{
/**********临界资源************/
//上锁
pthread_mutex_lock(&mutex);
if(flag != 0)
{
//休眠 解锁 尝试上锁 或者休眠
pthread_cond_wait(&cond, &mutex);
}
printf(" %c ", buf[0]);
flag = 1;
//唤醒
pthread_cond_signal(&cond1);
//解锁
///**********临界资源************/
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void * callbakc1(void * arg)
{
while(1)
{
/**********临界资源************/
//上锁
pthread_mutex_lock(&mutex);
if(flag != 1)
{
//休眠 解锁 尝试上锁 或者休眠
pthread_cond_wait(&cond1, &mutex);
//若尝试上锁成功, 那就接着运行后面的代码
//若尝试上锁失败,那就会休眠到cond上面
}
printf(" %c ", buf[1]);
flag = 2;
//换醒
pthread_cond_signal(&cond2);
//解锁
pthread_mutex_unlock(&mutex);
/*********临界资源********/
}
pthread_exit(NULL);
}
void * callbakc2(void * arg)
{
while(1)
{
/**********临界资源************/
//上锁
pthread_mutex_lock(&mutex);
if(flag != 2)
{
//休眠 解锁 尝试上锁 或者休眠
pthread_cond_wait(&cond2, &mutex);
//若尝试上锁成功, 那就接着运行后面的代码
//若尝试上锁失败,那就会休眠到cond上面
}
printf(" %c \n", buf[2]);
flag = 0;
//换醒
pthread_cond_signal(&cond);
//解锁
pthread_mutex_unlock(&mutex);
/*********临界资源********/
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//创建互斥锁
pthread_mutex_init(&mutex, NULL);
//创建条件变量
pthread_cond_init(&cond, NULL);
pthread_cond_init(&cond1, NULL);
pthread_cond_init(&cond2, NULL);
pthread_t tid;
pthread_t tid1;
pthread_t tid2;
pthread_create(&tid, NULL, callbakc,NULL);
pthread_create(&tid1, NULL,callbakc1,NULL);
pthread_create(&tid2, NULL, callbakc2,NULL);
pthread_join(tid, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}
现象
重点 用多条件变量