优选主流主机商
任何主机均需规范使用

Linux C++ 高效实现:使用condition变量构建阻塞队列的详细指南

实例如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 /*   * 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_ */

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 /*   * 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(&notFull,NULL);      pthread_cond_init(&notEmpty,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(&notFull,NULL);      pthread_cond_init(&notEmpty,NULL);   }   BlockingQueue::~BlockingQueue() {      this->capacity = 0;      head = 0,tail = 0;      delete queue;      pthread_mutex_destroy(&mutex);      pthread_cond_destroy(&notFull);      pthread_cond_destroy(&notEmpty); }   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(&notFull,&mutex);          cout << "not full,unlock" << endl;      }        {          queue[head] = item;          head = (head + 1) % capacity;          cout << "push " << item << endl;          //wake up poll thread          pthread_cond_signal(&notEmpty);          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(&notEmpty,&mutex);          cout << "not empty,unlock..." << endl;      }      {          ret = queue[tail];          tail = (tail + 1) % capacity;          cout << "take " << ret << endl;          //wake up push thread          pthread_cond_signal(&notFull);            pthread_mutex_unlock(&mutex);          return ret;      } }

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #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实现阻塞队列的方法全部内容了。

未经允许不得转载:搬瓦工中文网 » Linux C++ 高效实现:使用condition变量构建阻塞队列的详细指南