Linux C++ 使用condition实现阻塞队列
来源:互联网 发布:统计贸易数据自查报告 编辑:程序博客网 时间:2024/04/30 16:23
/* * 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;}
0 0
- Linux C++ 使用condition实现阻塞队列
- Linux C++ 使用condition实现阻塞队列
- java 使用ReentrantLock Condition实现阻塞队列
- 通过Condition实现自己的阻塞队列
- Condition的阻塞队列
- java实现缓冲区(阻塞队列,condition,lock)
- 12-2-多condition实现可阻塞消息队列
- Java多线程/并发21、利用Condition来实现阻塞队列
- 阻塞队列Queue/Deque/condition
- Condition实现阻塞序列1
- Lock+Condition 模仿 阻塞队列(BlockQueue)
- java多线程:10、阻塞队列【Condition】
- Python的condition和阻塞队列Queue
- Lock和Condition实现阻塞队列与生产者消费者模式的实现
- Lock和Condition实现线程通信(附阻塞队列的实例)
- 黑马程序员-java-condition-实现线程通信和可阻塞队列
- 使用C++ 11 实现阻塞队列
- 使用阻塞队列BlockingQueue实现生产者消费者
- $(document).height()与$(window).height()
- Anonymous Classes
- 快速排序的简单实现
- 【HDU 3270】Cow Sorting
- 网络访问流程
- Linux C++ 使用condition实现阻塞队列
- 奇怪的分式
- 东软学习,sql工具类
- 合同如火如荼有态度与合同任何人
- uva 10288 - Coupons(概率)
- 2014腾讯实习校招
- poj 2296 2-SAT(无矩形相交的最大边长)
- Porting WiFi drivers to Android
- 1050 moving table