Linux C++ 使用condition实现阻塞队列的方法
作者:jingxian 时间:2023-11-12 10:09:45
实例如下:
/*
* 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
0
投稿
猜你喜欢
网站友情链接的SEO基本技巧
2008-07-23 13:04:00
编辑与谷歌有意思的博弈 SEO的最后一课
2009-02-19 17:29:00
Text Link Ads注册申请中文图文教程
2008-01-19 13:51:00
如果你做站的热情未减 渴望成功 请看这篇文章
2007-10-12 12:18:00
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2023-08-05 00:51:10
网易邮箱收不到GoDaddy系统发来的邮件
2010-04-08 12:40:00
10招提高你的WordPress安全性
2008-04-21 11:20:00
支持开源 英特尔为云计算提供测试平台
2009-10-12 13:47:00
磨刀霍霍去建站 先看网站建设的10个规划
2009-01-23 11:55:00
PayPal购买Godaddy Deluxe Plan详细图解
2010-04-20 13:20:00
浅析Hyper-V安装CentOS 8问题
2021-01-21 11:18:03
iis7中session丢失的解决方法小结
2021-09-28 09:44:26
DNSPod遭遇10G流量恶意攻击
2010-02-21 10:37:00
Alexa排名和各项数据说明
2008-02-03 13:43:00
谈谈百度GGAD和阿里妈妈谁更适合我们小站长
2008-06-24 11:24:00
浅谈Discuz论坛的内部优化功能(实例演示)
2009-03-15 20:24:00
主题与关系并举提升网络社区的价值
2009-02-15 09:51:00
使用Xshell连接VMware上的Linux虚拟机(图文步骤)
2021-10-29 21:15:10
借用SSL验证,让IIS信息访问更安全(3)
2007-03-27 09:46:00
Linux运维之如何使用ss命令代替netstat
2021-07-01 00:53:23