生产者和消费者的简单的例子:用互斥锁控制
来源:互联网 发布:windows模拟器 安卓 编辑:程序博客网 时间:2024/05/17 04:33
#include<unistd.h>
#include<stdio.h>
#include<pthread.h>
#define MAX_SIZE 20
#define BUFFER_SIZE 8
struct
{
pthread_mutex_t mutex;
pthread_cond_t nofull;
pthread_cond_t noempty;
int buff[BUFFER_SIZE];
int nput; //下标
int nval; //值
int count; //统计生产者存入的数的个数
}shared ={PTHREAD_MUTEX_INITIALIZER,PTHREAD_COND_INITIALIZER,PTHREAD_COND_INITIALIZER};
void* produce(void *arg)
{
for(;;)
{
pthread_mutex_lock(&shared.mutex);
if(shared.nval >= 20)
{
pthread_mutex_unlock(&shared.mutex);
printf("produce finish.\n");
break;
}
if(shared.count < BUFFER_SIZE) //8
{
shared.buff[shared.nput] = shared.nval;
printf("shared.nput =%d\n",shared.nput);
shared.nput++; //下标+1
if(shared.nput >= BUFFER_SIZE)
{
shared.nput = 0;
}
shared.nval++ ; //为了方便,假设设置的值是对应的下标
shared.count++; //计数++
pthread_cond_signal(&shared.noempty);
}
else
pthread_cond_wait(&shared.nofull, &shared.mutex); //
pthread_mutex_unlock(&shared.mutex);
}
}
void* consume(void *arg)
{
int j = 0;
for(int i=0; i<MAX_SIZE;) //20
{
pthread_mutex_lock(&shared.mutex);
if(shared.count > 0)
{
i++;
printf("value = %d\n", shared.buff[j]);
j++;
if(j >= BUFFER_SIZE)
j = 0;
shared.count--;
pthread_cond_signal(&shared.nofull);
}
else
pthread_cond_wait(&shared.noempty, &shared.mutex);
pthread_mutex_unlock(&shared.mutex);
}
}
int main()
{
pthread_t ptid;
pthread_t ctid;
pthread_create(&ptid, NULL, produce, NULL);
pthread_create(&ctid, NULL, consume, NULL);
pthread_join(ptid,NULL);
pthread_join(ctid,NULL);
return 0;
}
- 生产者和消费者的简单的例子:用互斥锁控制
- 生产者和消费者的简单例子
- 简单的生产者消费者例子
- 一个简单的生产者/消费者例子
- Java多线程生产者和消费者的例子
- 简单的生产者-消费者
- 简单的activemq,生产者和消费者代码
- 生产者-消费者的经典例子
- 生产者,消费者的几个例子
- 简单的生产者消费者模型
- 一个简单的生产者消费者
- 线程演示生产者和消费者的一个例子
- 生产者和消费者。举一个寄信的例子
- Java_线程—经典的例子:生产者和消费者
- 一个简单的生产者与消费者的多线程例子(二):不让消费者或生产者无限期地等待
- 多线程--生产者消费者--简单例子
- 《生产者与消费者》简单例子?
- 关于生产者与消费者的例子
- Python学习笔记--生成器
- python字符串内建函数str.index()和str.rindex()
- (Android Studio)自定义 ProgressBar (二)
- Redis集群使用总结(二)
- 单例模式
- 生产者和消费者的简单的例子:用互斥锁控制
- P1004 滑雪 tyvj
- Lua For Windows 环境配置及使sciTE支持中文
- java的继承练习
- docker registry的删除问题
- JS 闭包类
- 求阶层的优化
- RippleEffect 产生涟漪效果的空间
- 逆向工程实验---二进制炸弹(CSAPP Project)