实现功能
给儿子和女儿吃,儿子只吃香蕉,女儿只吃苹果,
假定盘子里依次只能放入2个水果,设计程序实现儿子,
女儿吃水果的过程。
源代码
/* 功能:给儿子和女儿吃,儿子只吃香蕉,女儿只吃苹果, 假定盘子里依次只能放入2个水果,设计程序实现儿子, 女儿吃水果的过程。 时间:2019年12月02日 作者:幻竹涂 */
#include <semaphore.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>
#include <sys/stat.h>
typedef struct
{
sem_t sem[3];
pthread_mutex_t mutex;
int fd;
time_t start;
pthread_t t1;
pthread_t t2;
pthread_t t3;
}DATA;
#define FIFO_PATH "/tmp/123"
#define RES_NUM 6
void* mum(void* arg)
{
DATA* data = (DATA*)arg;
puts("mum start...");
//目标物品
char* goods[] = {
"apple ","banana","orange","tomato","patato"};
int idx = -1;
while(1)
{
sem_wait(&data->sem[0]);
pthread_mutex_lock(&data->mutex);
idx = rand()%5; //放入物品
write(data->fd,goods[idx],strlen(goods[idx]));
printf("mum set [%s] from selves\t",goods[idx]);
idx = rand()%5; //放入物品
write(data->fd,goods[idx],strlen(goods[idx]));
printf("mun set [%s] from selves\n",goods[idx]);
pthread_mutex_unlock(&data->mutex);
sem_post(&data->sem[1]);//启动线程grl();
sleep(1);
}
return NULL;
}
void* grl(void* arg)
{
DATA* data = (DATA*)arg;
puts("grl start...");
while(time(NULL)- data->start < 20)
{
sem_wait(&data->sem[1]);
char buf[32] = {
0};
pthread_mutex_lock(&data->mutex);
read(data->fd,buf,6);
if(strcmp(buf,"apple ") == 0) //是否存在相同
printf("\033[32m \t\tgril get [%s] from selves\n\033[0m",buf);
write(data->fd,buf,strlen(buf));//再次放入
read(data->fd,buf,6); //是否存在相同
if(strcmp(buf,"apple ") == 0)
printf("\033[33m \t\tgril get [%s] from selves\n\033[0m",buf);
write(data->fd,buf,strlen(buf));//再次放入
pthread_mutex_unlock(&data->mutex);
sem_post(&data->sem[2]); //启动线程son();
sleep(1);
}
pthread_cancel(data->t1);
pthread_cancel(data->t3);
return NULL;
}
void* son(void* arg)
{
DATA* data = (DATA*)arg;
puts("son start...");
while(1)
{
sem_wait(&data->sem[2]);
char buf[32] = {
0};
pthread_mutex_lock(&data->mutex);
read(data->fd,buf,6);
if(strcmp(buf,"banana") == 0)
printf("\033[36m \t\tson get [%s] from selves\n\033[0m",buf);
read(data->fd,buf,6);
if(strcmp(buf,"banana") == 0)
printf("\033[34m \t\tson get [%s] from selves\n\033[0m",buf);
pthread_mutex_unlock(&data->mutex);
sem_post(&data->sem[0]); //启动线程mum();
sleep(1);
}
pthread_cancel(data->t1);
pthread_cancel(data->t2);
return NULL;
}
int main()
{
DATA data;
data.start = time(NULL);
srand(data.start); //产生随机种子
alarm(25);
if(access(FIFO_PATH,F_OK) < 0) //创建有名管道
{
if(mkfifo(FIFO_PATH,0666) < 0)
{
perror("mkfifo");
exit(EXIT_FAILURE);
}
}
data.fd = open(FIFO_PATH,O_RDWR); //打开有名管道
sem_init(&data.sem[0],0,RES_NUM); //初始化信号
sem_init(&data.sem[1],0,0); //
sem_init(&data.sem[2],0,0); //
pthread_mutex_init(&data.mutex,NULL);//互锁
pthread_create(&data.t1,NULL,mum,&data); //创建线程
pthread_create(&data.t2,NULL,grl,&data);
pthread_create(&data.t3,NULL,son,&data);
pthread_join(data.t1,NULL);//等待线程
pthread_join(data.t2,NULL);
pthread_join(data.t3,NULL);
sem_destroy(&data.sem[0]); //回收信号
sem_destroy(&data.sem[1]);
pthread_mutex_destroy(&data.mutex); //回收锁
close(data.fd); //关闭有名管道
unlink(FIFO_PATH);//回收有名管道
return 0;
}