Linux C++ 使用condition实现阻塞队列的方法
作者:jingxian 发布时间:2023-11-12 10:09:45
标签:阻塞队列,linux
实例如下:
/*
* 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
投稿
猜你喜欢
- 怀疑是有其他的爬虫,明天都在爬我的几个网站。 在网上找找了给access.log和error.log减肥的方法 如下 CustomLog &
- 下载Hadoop 官网:http://hadoop.apache.org/releases.html先配置jdk环境(教程:https://
- 博客的未来是什么?很多专业人士都在思考这个问题,不过今天我这里要说的话题不是博客会发展成为什么样子(博客的未来一定是消亡,这是毋庸置疑的),
- 伴随着康盛创想(Comsenz)2010年核心产品Discuz! X1的正式发布,如何更快应用新的模板机制改版已经成为站长建站普遍关注的焦点
- 本文记录了centos 7 安装详细教程,供大家参考,具体内容如下1.centos 7 下载地址进入镜像下载主页:直接点击官方主页中的&qu
- 我们知道Google之前有发布一份“Google搜索引擎优化指南”,而近期百度也在百度创业者俱乐部发布了官方首份“百度搜索引擎优化指南”。这
- 选择服务器是一项重大决策,通常费时费钱。错误的决策会导致不良后果。在本文中,我们将首先谈谈一些在规划时需考虑的问题,然后进一步讨论如何在Wi
- 什么是 Elasticsearch?Elasticsearch 是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理
- 随着Linux企业应用的不断扩展。 有大量的网络服务器都在使用Linux操作系统。Linux服务器的安全性能受到越来越多的关注。 这里根据L
- 服务器在线12月2日报道 虚拟服务器在企业中发挥着越来越重要的作用,管理员面对的现状是在同一台物理服务器上安装了多台虚拟机。每台虚拟机都使用
- 1.1 iptables防火墙简介Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放
- Google AdSense 是一种获取收入的快速简便的方法,适合于各种规模的网站发布商。它可以在网站的内容网页上展示相关性较高的 Goog
- 10月10日消息,刚刚结束的“十一”长假中,全国外出旅游、各类消费数据再创新高,而在互联网上,拥有大
- 近日有很多站长服务器被入侵,被入侵后真是措手不及啊,“站长安全网”Jack为大家分析服务器被入侵前后的一些细节和处理方式,希望能为大家祈祷抛
- 不管你把Alexa排名奉为神明,还是把它看得 * 无比,数年来,它的确左右着整个互联网行业的许多游戏规则。由于中国互联网的特殊环境,Alexa
- 在网页运营改版过程中,经常有设计师或者运营同事有这样的疑问:我的页面到底产生了多大价值?这个页面引导的用户接下来访问了多少商品的页面?有没有
- 在中国市场份额落后于百度的情况下,Google似乎开始考虑“复制”百度的成功路径。昨日,本报记者获悉,Google近期将会宣布与巨鲸音乐网联
- 首先登录你的Godaddy 帐户,然后点击Godaddy 首页上方的Hosting 菜单,如下图所示: 然后选择下拉菜单里的Web site
- 搭建 PHP 其实不很难,只是有点繁琐。要是自己搭建一次 PHP + MySQL 环境很是费时。更糟的是,很多新手在配置 PHP 时常常出现
- 1:查看环境: [root@localhost ~]# cat /etc/redhat-release2:关掉防火墙#重启后生效开启[roo