实例如下:
#ifndef BLOCKINGQUEUE_H_ #define BLOCKINGQUEUE_H_ #include#include using namespace std; //template class BlockingQueue { public: BlockingQueue(); BlockingQueue(int capacity); ~BlockingQueue(); bool push(int item); int poll(); private: int capacity; int* queue; int head,tail; pthread_mutex_t mutex; pthread_cond_t notFull,notEmpty; }; #endif
#include "../include/BlockingQueue.h"
BlockingQueue::BlockingQueue()
{
this->capacity = 10;
queue = new int[capacity];
head = 0,tail = 0;
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(¬Full,NULL);
pthread_cond_init(¬Empty,NULL);
}
BlockingQueue::BlockingQueue(int capacity)
{
this->capacity = capacity;
queue = new int[capacity];
cout << "capacity " << sizeof(queue) << endl;
head = 0,tail = 0;
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(¬Full,NULL);
pthread_cond_init(¬Empty,NULL);
}
BlockingQueue::~BlockingQueue()
{
this->capacity = 0;
head = 0,tail = 0;
delete queue;
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(¬Full);
pthread_cond_destroy(¬Empty);
}
bool BlockingQueue::push(int item)
{
pthread_mutex_lock(&mutex);
cout << "you want push " << item << endl;
while((head + 1) % capacity == tail)//is full
{
cout << "is full,wait..." << endl;
// push wait
pthread_cond_wait(¬Full,&mutex);
cout << "not full,unlock" << endl;
}
{
queue[head] = item;
head = (head + 1) % capacity;
cout << "push " << item << endl;
//wake up poll thread
pthread_cond_signal(¬Empty);
pthread_mutex_unlock(&mutex);
return true;
}
}
int BlockingQueue::poll()
{
pthread_mutex_lock(&mutex);
int ret = 0;
while(head == tail) // is empty
{
cout << "is empty,wait..." << endl;
//poll wait
pthread_cond_wait(¬Empty,&mutex);
cout << "not empty,unlock..." << endl;
}
{
ret = queue[tail];
tail = (tail + 1) % capacity;
cout << "take " << ret << endl;
//wake up push thread
pthread_cond_signal(¬Full);
pthread_mutex_unlock(&mutex);
return ret;
}
}
#include#include "include/BlockingQueue.h" using namespace std; BlockingQueue queue(3); void* put(void *) { queue.push(1); queue.push(2); queue.push(3); queue.push(4); queue.push(5); return NULL; } void* take(void *) { queue.poll(); queue.poll(); queue.poll(); return NULL; } int main() { pthread_t put1,take1; pthread_create(&put1,NULL,put,0); pthread_create(&take1,NULL,take,0); void * retval; pthread_join(put1,&retval); pthread_join(take1,&retval); return 0; }
以上就是小编为大家带来的Linux C++ 使用condition实现阻塞队列的方法全部内容了,希望大家多多支持考高分网~



