实例如下:
/* * BlockingQueue.h * * Created on: 2014年6月10日 * Author: */#ifndef BLOCKINGQUEUE_H_#define BLOCKINGQUEUE_H_#include <iostream>#include <pthread.h>using namespace std;//template <typename T >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 /* BLOCKINGQUEUE_H_ */
/* * BlockingQueue.cpp * * Created on: 2014年6月10日 * Author: */#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 <iostream>#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实现阻塞队列的方法全部内容了,希望大家多多支持VEVB武林网~
新闻热点
疑难解答