标签:des blog io os for div sp log on
今天被问了一个bq,当时状态不好,只知道思路肯定是生产者消费者。后来冷静想想就写出来了。
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
using namespace std;
class BlockingQueue
{
public:
BlockingQueue(const int &n);
void push(const int &data);
int pop();
~BlockingQueue();
private:
int size;
int push_pos;
int pop_pos;
int *queue;
pthread_mutex_t pushMutex;
pthread_mutex_t popMutex;
sem_t waitforEmpty;
sem_t waitforFull;
};
BlockingQueue bq(10);
void *pushFunc(void *)
{
for(int i = 0; i < 100; ++i)
{
bq.push(i);
usleep(50000);
}
}
void* popFunc(void *)
{
for(int i = 0; i < 300; ++i)
{
bq.pop();
sleep(5);
}
}
int main()
{
pthread_t id1,id2,id3,id4;
pthread_create(&id1,NULL,pushFunc,NULL);
pthread_create(&id2,NULL,popFunc,NULL);
pthread_create(&id3,NULL,pushFunc,NULL);
pthread_create(&id4,NULL,popFunc,NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);
pthread_join(id3,NULL);
pthread_join(id4,NULL);
return 0;
}
BlockingQueue::BlockingQueue(const int &n):size(n),push_pos(0),pop_pos(0)
{
sem_init(&waitforEmpty,0,size);
sem_init(&waitforFull,0,0);
pthread_mutex_init(&pushMutex,NULL);
pthread_mutex_init(&popMutex,NULL);
queue = new int[size];
}
void BlockingQueue::push(const int &data)
{
sem_wait(&waitforEmpty);
pthread_mutex_lock(&pushMutex);
queue[push_pos] = data;
push_pos = (push_pos + 1)%size;
printf("push %d\n",data);
pthread_mutex_unlock(&pushMutex);
sem_post(&waitforFull);
}
int BlockingQueue::pop()
{
sem_wait(&waitforFull);
pthread_mutex_lock(&popMutex);
int data = queue[pop_pos];
pop_pos = (pop_pos + 1)%size;
printf("pop %d\n",data);
pthread_mutex_unlock(&popMutex);
sem_post(&waitforEmpty);
return data;
}
BlockingQueue::~BlockingQueue()
{
sem_destroy(&waitforFull);
sem_destroy(&waitforEmpty);
pthread_mutex_destroy(&pushMutex);
pthread_mutex_destroy(&popMutex);
delete []queue;
}
标签:des blog io os for div sp log on
原文地址:http://www.cnblogs.com/dy-techblog/p/3970815.html