生产者(生产一个随机数)与消费者(打印一个随机数)的案例

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>

pthread_t tid1;
pthread_t tid2;

int pro = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//定义互斥锁,并初始化
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;//定义条件变量,并初始化

void *producer(void *arg) //写线程操作函数
{
int data = 0;
while(1)
{
pthread_mutex_lock(&mutex);//上互斥锁
data = rand()%1000;//获得一个随机值
pro = data;
printf("produce a item:%d\n",pro);
pthread_mutex_unlock(&mutex);//解锁
pthread_cond_signal(&cond);//发送信号给另一个线程,使之条件满足
sleep(1);
}
pthread_exit(NULL);
}

void *consumer(void *arg) //读线程操作函数
{
while(1)
{
pthread_mutex_lock(&mutex);//上锁
while( pro == 0)//判断pro的值是否为0,不为0说明生产好产品,跳出循环,等于0说明产品未生产好,进入wait函数
{
pthread_cond_wait(&cond,&mutex);//如果未得到信号则阻塞,并释放互斥锁,等待生产者生产好产品后,再抢到锁
}
printf("consumer get item pro:%d\n",pro);//得到产品后进行打印
pro = 0;//将pro重新置0,重新生产产品
pthread_mutex_unlock(&mutex);//解锁
}

pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
int ret;

ret = pthread_create(&tid1,NULL,producer,NULL);//创建一个线程进行写操作
if(ret != 0)
{
fprintf(stderr,"fail to get thread1\n");
return -1;
}
ret = pthread_create(&tid2,NULL,consumer,NULL);//创建一个线程进行读操作
if(ret != 0)
{
fprintf(stderr,"fail to get thread2\n");
return -1;
}

pthread_join(tid1,NULL);
pthread_join(tid2,NULL);

return 0;
}

posted @   major825  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示