Linux c/c   后台开发组建之:高性能阻塞队列

(2015-12-01 06:01:47)

标签:

Linux

c/c

杂谈

分类:

c/c

阻塞队列是后台开发中多线程异步架构的基本数据结构,像python, java 都提供线程安全的阻塞队列,c

可能需要自己实现一个模板。

从性能考虑,自己没有使用STL的queue作为基本数据结构,而是使用循环数组作为基本数据结构,性能应该比queue高,省去了动态内存分配和回收。

确点就是,队列大小不可动态扩展,当时实际开发中,可以通过压力测试和内存的限制,配置合适的队列大小来满足应用需求。

#ifndef BLOCK_QUEUE_H

#define BLOCK_QUEUE_H

#include

#include

#include

#include

using namespace std;

template

class block_queue

{

public:

block_queue(int max_size = 1000)

{

if(max_size <= 0)

{

exit(-1);

}

m_max_size = max_size;

m_array = new T[max_size];

m_size = 0;

m_front = -1;

m_back = -1;

m_mutex = new pthread_mutex_t;

m_cond = new pthread_cond_t;

pthread_mutex_init(m_mutex, NULL);

pthread_cond_init(m_cond, NULL);

}

void clear()

{

pthread_mutex_lock(m_mutex);

m_size = 0;

m_front = -1;

m_back = -1;

pthread_mutex_unlock(m_mutex);

}

~block_queue()

{

pthread_mutex_lock(m_mutex);

if(m_array != NULL)

delete m_array;

pthread_mutex_unlock(m_mutex);

pthread_mutex_destroy(m_mutex);

pthread_cond_destroy(m_cond);

delete m_mutex;

delete m_cond;

}

bool full()const

{

pthread_mutex_lock(m_mutex);

if(m_size >= m_max_size)

{

pthread_mutex_unlock(m_mutex);

return true;

}

pthread_mutex_unlock(m_mutex);

return false;

}

bool empty()const

{

pthread_mutex_lock(m_mutex);

if(0 == m_size)

{

pthread_mutex_unlock(m_mutex);

return true;

}

pthread_mutex_unlock(m_mutex);

return false;

}

bool front(T& value)const

{

pthread_mutex_lock(m_mutex);

if(0 == m_size)

{

pthread_mutex_unlock(m_mutex);

return false;

}

value = m_array[m_front];

pthread_mutex_unlock(m_mutex);

return true;

}

bool back(T& value)const

{

pthread_mutex_lock(m_mutex);

if(0 == m_size)

{

pthread_mutex_unlock(m_mutex);

return false;

}

value = m_array[m_back];

pthread_mutex_unlock(m_mutex);

return true;

}

int size()const

{

int tmp = 0;

pthread_mutex_lock(m_mutex);

tmp = m_size;

pthread_mutex_unlock(m_mutex);

return tmp;

}

int max_size()const

{

int tmp = 0;

pthread_mutex_lock(m_mutex);

tmp = m_max_size;

pthread_mutex_unlock(m_mutex);

return tmp;

}

bool push(const T& item)

{

pthread_mutex_lock(m_mutex);

if(m_size >= m_max_size)

{

pthread_cond_broadcast(m_cond);

pthread_mutex_unlock(m_mutex);

return false;

}

m_back = (m_back 1) % m_max_size;

m_array[m_back] = item;

m_size ;

pthread_cond_broadcast(m_cond);

pthread_mutex_unlock(m_mutex);

return true;

}

bool pop(T& item)

{

pthread_mutex_lock(m_mutex);

while(m_size <= 0)

{

if(0 != pthread_cond_wait(m_cond, m_mutex))

{

pthread_mutex_unlock(m_mutex);

return false;

}

}

m_front = (m_front 1) % m_max_size;

item = m_array[m_front];

m_size--;

pthread_mutex_unlock(m_mutex);

return true;

}

bool pop(T& item, int ms_timeout)

{

struct timespec t = {0,0};

struct timeval now = {0,0};

gettimeofday(&now, NULL);

pthread_mutex_lock(m_mutex);

if(m_size <= 0)

{

t.tv_sec = now.tv_sec ms_timeout/1000;

t.tv_nsec = (ms_timeout % 1000)*1000;

if(0 != pthread_cond_timedwait(m_cond, m_mutex,

&t))

{

pthread_mutex_unlock(m_mutex);

return false;

}

}

if(m_size <= 0)

{

pthread_mutex_unlock(m_mutex);

return false;

}

m_front = (m_front 1) % m_max_size;

item = m_array[m_front];m_size--;

pthread_mutex_unlock(m_mutex);

return true;

}

private:

pthread_mutex_t *m_mutex;

pthread_cond_t *m_cond;

T *m_array;

int m_size;

int m_max_size;

int m_front;

int m_back;

};

#endif

#include

#include"block_queue.h"

using namespace std;

block_queue g_queue(100);

void *p(void *args)

{

sleep(1);

int data = 0;

for(int i = 0; i < 100; i )

{

g_queue.push(data );

}

return NULL;

}

void *c(void* args)

{

while(true)

{

int t = 0;

if(!g_queue.pop(t,1000))

{

cout<

continue;

}

else

{

cout<

}

g_queue.pop(t);

cout<

}

return NULL;

}

int main()

{

pthread_t id;

pthread_create(&id, NULL, p, NULL);

//pthread_create(&id, NULL, p, NULL);

//pthread_create(&id, NULL, c, NULL);

pthread_create(&id, NULL, c, NULL);

for(;;)sleep(1);

return 0;

}

分享:

喜欢

0

赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

java高性能阻塞队列,Linux c/c   后台开发组建之:高性能阻塞队列相关推荐

  1. 【Linux】C++后台开发面试

    本文将讲述(Linux)服务器后台开发岗位的要求,包含了大部分会遇到的面试题目.掌握文中提到的技术,也算少许入门水平了,此文既是面经,也是后台开发的入门手册.无论社招还是校招,都可作为一个参考. 本文 ...

  2. 「Linux」C++后台开发面试总结(献给进击BAT的你)

    本文将讲述(Linux)服务器后台开发岗位的要求,包含了大部分会遇到的面试题目.掌握文中提到的技术,也算少许入门水平了,此文既是面经,也是后台开发的入门手册.无论社招还是校招,都可作为一个参考. 本文 ...

  3. Linux C/C++后台开发高级架构师进阶指南-剑指腾讯T9

    C++后台开发是一个庞杂的技术栈,因为没有统一的开发框架并且应用行业非常广泛.所有涉猎广泛,这里就把C/C++++后台开发的技术点进行整理总结,看完以后,不会让你失望的. -------------- ...

  4. 反编译linux内核_Linux 后台开发常用调试工具

    01 总览 编译阶段 nm 获取二进制文件包含的符号信息 strings 获取二进制文件包含的字符串常量 strip 去除二进制文件包含的符号 readelf 显示目标文件详细信息 objdump 尽 ...

  5. linux socket 阻塞服务端 非阻塞客户端,linux下异步RPC的阶段性总结-非阻塞SOCKET客户端...

    尽可能使用非阻塞socket int flags, s; flags = fcntl (fd, F_GETFL, 0); if (flags == -1){ close(fd); return -1; ...

  6. 后台开发经典书籍--高性能mysql

  7. socket技术路线_呐,这不就是你要的C++后台开发学习路线吗?

    校招形势 在去年结束的秋季招聘中,后台开发或服务器开发的岗位需求一度火热,甚至超过了算法岗.不少同学从诸神黄昏的算法岗战场上退下,转向更偏向工程能力的后台开发岗,从而造成后台开发岗位竞争的大爆发. 后 ...

  8. 11年程序员给本科、研究生应届生以及准备从事后台开发同学的建议,学习进阶之路

    校招形势 目前校招招聘中,后台开发或服务器开发的岗位需求一度火热,甚至超过了算法岗.不少同学从诸神黄昏的算法岗战场上退下,转向更偏向工程能力的后台开发岗,从而造成后台开发岗位竞争的大爆发. 后台开发工 ...

  9. C++后台开发的主流技能加点

    后台开发工程师主流使用的编程语言有C++.Java.PHP以及目前慢慢流行的Golang等.本文就将以C++的角度,讲讲如何学习和准备后台开发的岗位. 一.语言基础 无论是C++开发还是Java开发, ...

最新文章

  1. 获取请求url的查询字符串
  2. Java之反射代码演示说明
  3. uboot 命令分析(一) — bootm
  4. VS2003转VS2010 fatal error C1189: #error
  5. java安卓原生影视APP源码 对接苹果cms后台
  6. python进入高考-Python已进入小学教材将加入高考
  7. 假设一个进程的页表如下所示_理解进程的新建和执行过程
  8. nodejs基础整理
  9. K8s 使用helm 安装 EFK和ELK分布式日志分析系统系列(es版本:6.7.0;)
  10. Scikit-learn_回归算法_支持向量机回归
  11. 【C语言】C语言实现泛型编程
  12. Markdown - Markdown 引用图片太大怎么办 md控制图片的大小 对齐方式
  13. 33 - Guarded Suspension模式 等待唤醒机制的规范
  14. 京东充值系统现漏洞 被恶意盗刷
  15. 深入理解java虚拟机-第三版-周明志 Java虚拟机规范(java se 8) pdf
  16. YApi接口管理平台远程代码执行漏洞(含批量POC)
  17. 阿里实习生电话面试总结
  18. 基于R语言的聚类分析(k-means,层次聚类)
  19. 【git】统计每个人的代码行数
  20. 帝国cms e loop php,帝国CMS灵动标签e:loop的使用

热门文章

  1. 使用javap工具分析Java String(字符串)操作
  2. Java 写时拷贝容器CopyOnWriteArrayList的测试
  3. 如何根据SAP CRM扩展字段的UI标签找到其ID
  4. Deploy your UI5 application into SAP Cloud Platform and launch as a tile
  5. why I cannot set SAP UI5 dropdown list as not selected
  6. SAP Fiori :why my filter for category does not work
  7. where is field waerk in pricing structure filled
  8. how to get line number of given ABAP source code
  9. transfer = C only read dynamically - why it fails to work
  10. Equipment upload - ERP inbound的debug