织梦CMS - 轻松建站从此开始!

罗索

替换STL的queue

jackyhwei 发布于 2010-12-19 12:37 点击:次 
STL库是个伟大的作品,不过,有的时候,它也有一点点小问题。我写的一个服务器程序,在运行大约8小时候,出现Program received signal SIGSEGV, Segmentation fault.
TAG:

STL库是个伟大的作品,不过,有的时候,它也有一点点小问题。

我写的一个服务器程序,在运行大约8小时候,出现Program received signal SIGSEGV, Segmentation fault.

#1  0x00002adde5c9a853 in _int_free () from /lib64/libc.so.6
#2  0x00002adde5c9a99c in free () from /lib64/libc.so.6

下面一级堆栈是
m_queuefreep->pop();

下面是源码:
  1. data_t *try_get_free_data() 
  2. boost::mutex::scoped_try_lock lock(m_free_mutex); 
  3. if(!lock.owns_lock()) 
  4. return NULL; 
  5.  
  6. if(m_queuefreep->empty()) 
  7. return NULL; 
  8. data_t* datap = m_queuefreep->front(); 
  9. m_queuefreep->pop(); 
  10.  
  11. return datap; 
  12. }; 
这个队列,我只是用来存放结构体指针,而且已经加锁保护;
m_queuefreep->pop()的过程中,会调用free()函数,free一个指针类型;
这没有必要free的阿。

经过仔细分析,可以确认自己的代码没有问题。
百度到了一篇文章:《谁知道malloc_consolidate是个什么函数
这位老兄,也碰到类似的问题,他提出的解决办法是替换queue。

std::queue.pop()的怪异问题:多线程环境下,pop()将调用对象的析构函数
这位老兄,也一样,碰到过这个问题。

这位老兄的模板类写的非常好,收录如下:
  1. #include <stdexcept>                // for debug purpose 
  2.  
  3. template <typename item, unsigned int qsize> 
  4. class queue { 
  5. public
  6. item data[qsize]; 
  7. unsigned int rp,wp; 
  8. bool full; 
  9.  
  10. queue():   rp(0),wp(0),full(false) {} 
  11.  
  12. bool empty() { return ((rp == wp) && (!full)); } 
  13.  
  14. unsigned int size() { 
  15. if(!full)   return (wp-rp+qsize)%qsize; 
  16. else        return qsize; 
  17.  
  18. item& front() { 
  19. if(empty()) throw
  20. return data[rp]; 
  21.  
  22. item& back() { 
  23. if(empty()) throw
  24. return data[(wp-1+qsize)%qsize]; 
  25.  
  26. void push(const item dd) { 
  27. if(full)    throw
  28. data[wp] = dd; 
  29. wp = (wp+1)%qsize; 
  30. if(wp == rp)    full = true
  31.  
  32. void pop(){ 
  33. if(empty()) throw
  34. rp = (rp + 1)%qsize; 
  35. full = false
  36. }; 
  37.  
  38. template <typename item, unsigned int qsize> 
  39. class stack 
  40. public
  41. item data[qsize]; 
  42. unsigned int p; 
  43. stack():   p(0){} 
  44.  
  45. bool empty() {  return (p == 0);} 
  46. unsigned int size() { return p; } 
  47.  
  48. item& top(){ 
  49. if(empty()) throw
  50. return data[p-1]; 
  51. void push(const item dd) { 
  52. if(p==qsize) throw
  53. data[p++] = dd; 
  54.  
  55. void pop() { 
  56. if(empty()) throw
  57. p--; 
  58. }; 

并略加修改:

  1. /* 
  2. * myqueue.h 
  3. *    meant to replace the STL queue. 
  4. *  Created on: 2010-3-19 
  5. *      Author: guoqiang 
  6. */ 
  7. #ifndef MYQUEUE_H_ 
  8. #define MYQUEUE_H_ 
  9.  
  10. #include <stdlib.h> 
  11. #include <exception> 
  12. #include <stdexcept>                // for debug purpose 
  13. using namespace std; 
  14.  
  15. template <typename item> 
  16. class gqueue 
  17. public
  18. gqueue(int capacity):   m_rp(0), m_wp(0), m_full(false
  19. m_capacity = capacity; 
  20. m_datap =  (item*)malloc(sizeof(item)*m_capacity); 
  21. if(m_datap == NULL) 
  22. throw(exception()); 
  23.  
  24. virtual ~gqueue() throw() 
  25. if(m_datap) 
  26. free(m_datap); 
  27. m_datap = NULL; 
  28. }; 
  29.  
  30. bool empty() 
  31. return ((m_rp == m_wp) && (!m_full)); 
  32.  
  33. unsigned int size() 
  34. if(!m_full) 
  35. return (m_wp-m_rp+m_capacity)%m_capacity; 
  36. else 
  37. return m_capacity; 
  38.  
  39. item& front() 
  40. if(empty()) 
  41. throw
  42.  
  43. return m_datap[m_rp]; 
  44.  
  45. item& back() 
  46. if(empty()) 
  47. throw
  48. return m_datap[(m_wp-1+m_capacity)%m_capacity]; 
  49.  
  50. void push(const item dd) 
  51. if(m_full) 
  52. throw
  53. m_datap[m_wp] = dd; 
  54. m_wp = (m_wp+1)%m_capacity; 
  55. if(m_wp == m_rp) 
  56. m_full = true
  57.  
  58. void pop() 
  59. if(empty()) 
  60. throw
  61. m_rp = (m_rp + 1)%m_capacity; 
  62. m_full = false
  63.  
  64. private
  65. unsigned int m_capacity; 
  66. // item data[qsize]; 
  67. item* m_datap; 
  68. unsigned int m_rp; 
  69. unsigned int m_wp; 
  70. bool m_full; 
  71.  
  72. }; 
  73.  
  74. #endif /* MYQUEUE_H_ */ 

替换了到自己的工程当中,编译,执行;等待中,等待出错,或者永远不出错。

原文来自:http://hi.baidu.com/goggle1/blog/item/0ea14befc4675ef7b2fb952a.html

(guoqiang)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201012/10617.html]
本文出处:百度博客 作者:guoqiang
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容