unix 多进程下的生产者和消费者实现
2008-05-27 15:33
183 查看
#include<iostream.h>
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include <sys/stat.h>
#include<time.h>
#include<unistd.h>
#include <semaphore.h>
#include<sys/mman.h>
typedef struct
{
int buf[129];
int occupied;
int nextin;
int nextout;
pthread_mutex_t mutex;
pthread_cond_t more;
pthread_cond_t less;
} buffer_t;
void producer(buffer_t *b,char c)
{
pthread_mutex_lock(&(b->mutex));
if(b->occupied > 128)
{
pthread_cond_wait(&(b->less),&(b->mutex));
}
b->buf[b->nextin++]=c;
b->nextin=b->nextin%128;
b->occupied++;
pthread_cond_signal(&(b->more));
pthread_mutex_unlock(&(b->mutex));
}
void producer_driver(buffer_t *b)
{
char item;
while (1)
{
item = getchar();
if (item == EOF)
{
producer(b,'/0');
break;
}
else
{
producer(b, (char)item);
sleep(0.5);
}
}
}
char consumer(buffer_t *b)
{
char c;
pthread_mutex_lock(&(b->mutex));
if(b->occupied <= 0)
{
pthread_cond_wait(&(b->more),&(b->mutex));
}
c=b->buf[b->nextout++];
b->nextout=b->nextout%128;
b->occupied--;
pthread_cond_signal(&(b->less));
pthread_mutex_unlock(&(b->mutex));
return c;
}
void consumer_driver(buffer_t *b)
{
char item;
while (1)
{
if ((item = consumer(b))=='/0')
{
break;
}
putchar(item);
sleep(1);
//item = consumer(b);
//cout<<item<<endl;
//cout.flush();
}
}
int main()
{
int zfd;
buffer_t *buffer;
pthread_mutexattr_t mattr;
pthread_condattr_t cvattr_less, cvattr_more;
zfd = open("/dev/zero", O_RDWR);
buffer = (buffer_t *)mmap(NULL, sizeof(buffer_t),
PROT_READ|PROT_WRITE, MAP_SHARED, zfd, 0);
buffer->occupied = buffer->nextin = buffer->nextout = 0;
pthread_mutexattr_init(&mattr);
pthread_mutexattr_setpshared(&mattr,PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&buffer->mutex, &mattr);
pthread_condattr_init(&cvattr_less);
pthread_condattr_setpshared(&cvattr_less, PTHREAD_PROCESS_SHARED);
pthread_cond_init(&buffer->less, &cvattr_less);
pthread_condattr_init(&cvattr_more);
pthread_condattr_setpshared(&cvattr_more,PTHREAD_PROCESS_SHARED);
pthread_cond_init(&buffer->more, &cvattr_more);
if (fork() == 0)
{
consumer_driver(buffer);
}
else
{
producer_driver(buffer);
}
sleep(120);
exit(0);
}
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include <sys/stat.h>
#include<time.h>
#include<unistd.h>
#include <semaphore.h>
#include<sys/mman.h>
typedef struct
{
int buf[129];
int occupied;
int nextin;
int nextout;
pthread_mutex_t mutex;
pthread_cond_t more;
pthread_cond_t less;
} buffer_t;
void producer(buffer_t *b,char c)
{
pthread_mutex_lock(&(b->mutex));
if(b->occupied > 128)
{
pthread_cond_wait(&(b->less),&(b->mutex));
}
b->buf[b->nextin++]=c;
b->nextin=b->nextin%128;
b->occupied++;
pthread_cond_signal(&(b->more));
pthread_mutex_unlock(&(b->mutex));
}
void producer_driver(buffer_t *b)
{
char item;
while (1)
{
item = getchar();
if (item == EOF)
{
producer(b,'/0');
break;
}
else
{
producer(b, (char)item);
sleep(0.5);
}
}
}
char consumer(buffer_t *b)
{
char c;
pthread_mutex_lock(&(b->mutex));
if(b->occupied <= 0)
{
pthread_cond_wait(&(b->more),&(b->mutex));
}
c=b->buf[b->nextout++];
b->nextout=b->nextout%128;
b->occupied--;
pthread_cond_signal(&(b->less));
pthread_mutex_unlock(&(b->mutex));
return c;
}
void consumer_driver(buffer_t *b)
{
char item;
while (1)
{
if ((item = consumer(b))=='/0')
{
break;
}
putchar(item);
sleep(1);
//item = consumer(b);
//cout<<item<<endl;
//cout.flush();
}
}
int main()
{
int zfd;
buffer_t *buffer;
pthread_mutexattr_t mattr;
pthread_condattr_t cvattr_less, cvattr_more;
zfd = open("/dev/zero", O_RDWR);
buffer = (buffer_t *)mmap(NULL, sizeof(buffer_t),
PROT_READ|PROT_WRITE, MAP_SHARED, zfd, 0);
buffer->occupied = buffer->nextin = buffer->nextout = 0;
pthread_mutexattr_init(&mattr);
pthread_mutexattr_setpshared(&mattr,PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&buffer->mutex, &mattr);
pthread_condattr_init(&cvattr_less);
pthread_condattr_setpshared(&cvattr_less, PTHREAD_PROCESS_SHARED);
pthread_cond_init(&buffer->less, &cvattr_less);
pthread_condattr_init(&cvattr_more);
pthread_condattr_setpshared(&cvattr_more,PTHREAD_PROCESS_SHARED);
pthread_cond_init(&buffer->more, &cvattr_more);
if (fork() == 0)
{
consumer_driver(buffer);
}
else
{
producer_driver(buffer);
}
sleep(120);
exit(0);
}
相关文章推荐
- unix 多进程下的生产者和消费者实现
- Unix IPC之Posix信号量实现生产者消费者
- unix下用C语言实现的生产者消费者问题
- 多进程 队列 实现生产者消费者模型 python 笔记
- go goroutine 简单实现生产者和消费者
- 经典问题之生产者-消费者问题——Lock实现
- Java多线程实现生产者消费者程序(Wait,Notify实现和Lock,Condition实现)
- Kafka使用go实现生产者和消费者
- 用java实现生产者和消费者问题
- 使用Lock和Condition实现生产者和消费者
- 用C语言实现--生产者与消费者的问题(PV操作)
- java线程间通信[实现不同线程之间的消息传递(通信),生产者和消费者模型]
- ruby线程实现生产者消费者问题示例(队列Queue实现线程同步)
- 多线程实现消费者生产者的例子
- 六种方式实现生产者消费者(未完)
- Java——生产者消费者多线程实现
- 生产者消费者简单实现
- 基于并发包同步机制实现生产者-消费者模式
- Java 实现生产者消费者问题
- IPC之生产者消费者问题:Java实现