Linux C++ 使用condition实现阻塞队列
来源:互联网 发布:windows live影片制作 编辑:程序博客网 时间:2024/04/29 17:06
-
-
-
-
-
-
-
- #ifndef BLOCKINGQUEUE_H_
- #define BLOCKINGQUEUE_H_
-
- #include <iostream>
- #include <pthread.h>
-
- using namespace std;
-
-
- 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_ */
-
-
-
-
-
-
- #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)
- {
- cout << "is full,wait..." << endl;
-
- pthread_cond_wait(¬Full,&mutex);
- cout << "not full,unlock" << endl;
- }
-
- {
- queue[head] = item;
- head = (head + 1) % capacity;
- cout << "push " << item << endl;
-
- pthread_cond_signal(¬Empty);
- pthread_mutex_unlock(&mutex);
-
- return true;
- }
- }
-
- int BlockingQueue::poll()
- {
- pthread_mutex_lock(&mutex);
- int ret = 0;
- while(head == tail)
- {
- cout << "is empty,wait..." << endl;
-
- pthread_cond_wait(¬Empty,&mutex);
- cout << "not empty,unlock..." << endl;
- }
- {
- ret = queue[tail];
- tail = (tail + 1) % capacity;
- cout << "take " << ret << endl;
-
- 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;
- }
0 0