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

Gamila ·
更新时间:2024-11-10
· 632 次阅读

实例如下:

/* * 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(&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 <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++ 获取文件绝对路径的实例代码Linux中使用VS Code编译调试C++项目详解Linux 平台上比较好的C/C++ IDE 清单总结UNIX/LINUX下C++程序计时的方法Linux下用C++实现俄罗斯方块C++实现Linux下弹出U盘的方法在Linux下编译C或C++程序的教程linux系统中c++写日志文件功能分享Linux上搭建C/C++IDE开发环境详解 linux c++的编译器g++的基本使用



CONDITION c+ 队列 方法 Linux C++

需要 登录 后方可回复, 如果你还没有账号请 注册新账号