Linux线程--生产者消费者模型

在生产者--消费者模型中,主程序分别启动了生产者线程和消费者线程,其中生产者线程不停的写入共享的循环缓冲区,二消费者线程这不停的从缓冲区中取出数据。
在生产者写入缓冲区时,首先要获得互斥锁,并且判断缓冲区是否为满。也就是判断写指针+1后是否等于读指针,如果相等则进入等待状态,等候条件变量notfull发出信号,如果判断条件不等。则向缓冲区写一个整数,同时设置条件变量notempty,最后释放互斥锁!
当消费者从缓冲区读数时候,首先要获得互斥锁,并且判断缓冲区是否为空,也就是判断写指针是否等于读指针,如果相等则进入等待状态,等候条件变量notempty发出信号,如果判断结果不等,则从缓冲区读出一个整数,同时设置条件变量notfull,最后释放互斥锁。

#include<stdio.h>
#include<pthread.h> 

#define BUFFER_SIZE 8

struct prodcons{
int buffer[BUFFER_SIZE];
pthread_mutex_t lock;
int readpos,writepos;
pthread_cond_t notempty;//缓冲区未空判断
pthread_cond_t notfull;//缓冲区未满判断
};

void init(struct prodcons *b)
{
pthread_mutex_init(&b->lock,NULL);
pthread_cond_init(&b->notempty,NULL);
pthread_cond_init(&b->notfull,NULL);

b->readpos=0;
b->writepos=0;

}
void put(struct prodcons *b,int data)
{
if( (b->writepos + 1 ) % BUFFER_SIZE == b->readpos)
{
pthread_cond_wait(&b->notfull,&b->lock);
printf("wait for not full!\n");
}

b->buffer[b->writepos]=data;
b->writepos++;

if(b->writepos >=BUFFER_SIZE)
b->writepos = 0;

pthread_cond_signal(&b->notempty);
pthread_mutex_unlock(&b->lock);
}

int get(struct prodcons *b)
{
int data;

pthread_mutex_lock(&b->lock);
if(b->writepos == b->readpos)
{
pthread_cond_wait(&b->notempty,&b->lock);
printf("wait for not empty!\n");
}

data = b->buffer[b->readpos];
b->readpos++;

if(b->readpos >= BUFFER_SIZE)
b->readpos = 0;
pthread_cond_signal(&b->notfull);
pthread_mutex_unlock(&b->lock);

return data;
}

#define OVER (-1)
struct prodcons buffer;

void *producer(void *data)
{
int n;

for(n=0;n<1000;n++)
{
printf("put----->%d \n",n);
put(&buffer,n);
}
put(&buffer,OVER);

return NULL;
}

void *consumer(void *data)
{
int d;

while(1)
{
d = get(&buffer);

if(d == OVER)
break;

printf("%d------>get\n",d);
}

return NULL;
}
int main(void)
{
pthread_t th_a,th_b;

void *retval;

init(&buffer);

pthread_create(&th_a,NULL,producer,0);
pthread_create(&th_b,NULL,consumer,0);

pthread_join(th_a,&retval);
pthread_join(th_b,&retval);

return 0;
}


Makefile如下::
CC=gcc
OBJS2=mYpthead.o
EXEC2=mYpthead
all:$(EXEC2)
$(EXEC2):$(OBJS2)
$(CC) -o $@ $(OBJS2) -lpthread
clean:
rm -f $(OBJS2) $(EXEC2)
<script type="text/javascript" id="wumiiRelatedItems"> </script>
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值