linux condition用法,Linux C++ 使用condition实现阻塞队列的方法

实例如下:

/* * BlockingQueue.h * * Created on: 2014年6月10日 * Author: */ #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 /* 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(&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;     } }

#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实现阻塞队列的方法全部内容了,希望大家多多支持脚本之家~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值