Linux C++ 使用condition实现阻塞队列的方法
linux  /  管理员 发布于 7年前   166
实例如下:
/* * 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;}
以上就是小编为大家带来的Linux C++ 使用condition实现阻塞队列的方法全部内容了,希望大家多多支持~
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号