免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2836 | 回复: 4
打印 上一主题 下一主题

[C++] 在坛子里找到的线程安全的队列代码,咋用??? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-04-08 18:31 |只看该作者 |倒序浏览
本帖最后由 jd808 于 2016-04-08 19:48 编辑

  1. #include <pthread.h>
  2. #include <iostream>
  3. #include <queue>

  4. #define QUEUESIZE 10

  5. template <class Object>
  6. class ThreadQueue {
  7.         private:
  8.                 std::queue <Object> que;
  9.                 int size;
  10.                 pthread_mutex_t mutex;

  11.         public:
  12.                 ThreadQueue();
  13.                 ~ThreadQueue();

  14.         public:
  15.                 bool IsEmpty() const;
  16.                 void Push(const Object &obj);
  17.                 void Pop();
  18.                 int Count() const;
  19.                 Object& Front();
  20.                 Object& Back();
  21.                 void Clear();
  22. };

  23. class UserSendCache {
  24.         private:


  25.         public:
  26.                 UserSendCache();
  27.                 ~UserSendCache();

  28.         public:

  29. };



  30. template <class Object>
  31. ThreadQueue<Object>::ThreadQueue()
  32. {
  33.     pthread_mutex_init(&mutex, NULL);
  34.     size = 0;
  35. }

  36. template <class Object>
  37. ThreadQueue<Object>::~ThreadQueue()
  38. {
  39.     pthread_mutex_destroy(&mutex);
  40. }

  41. template <class Object>
  42. bool ThreadQueue<Object>::IsEmpty() const
  43. {
  44.     if(size == 0)
  45.         return true;
  46.     else
  47.         return false;
  48. }

  49. //从队列尾部添加数据
  50. template <class Object>
  51. void ThreadQueue<Object>::Push(const Object &obj)
  52. {
  53.     pthread_mutex_lock(&mutex);
  54.     if(que.size()==QUEUESIZE){//已经满了,删除最开始那个,然后在加入,保证队列始终不超过QUEUESIZE
  55.             que.pop();
  56.     }

  57.     que.push(obj);
  58.     size = que.size();
  59.     pthread_mutex_unlock(&mutex);
  60. }

  61. //队列头部数据出队
  62. template <class Object>
  63. void ThreadQueue<Object>::Pop()
  64. {
  65.     pthread_mutex_lock(&mutex);
  66.     que.pop();
  67.     size = que.size();
  68.     pthread_mutex_unlock(&mutex);
  69. }

  70. template <class Object>
  71. int ThreadQueue<Object>::Count() const
  72. {
  73.     return(size);
  74. }

  75. //返回队列头部数据
  76. template <class Object>
  77. Object& ThreadQueue<Object>::Front()
  78. {
  79.     pthread_mutex_lock(&mutex);
  80.     Object &obj = que.front();
  81.     pthread_mutex_unlock(&mutex);
  82.     return obj;
  83. }

  84. //返回队列尾部数据
  85. template <class Object>
  86. Object& ThreadQueue<Object>::Back()
  87. {
  88.     pthread_mutex_lock(&mutex);
  89.     Object &obj = que.back();
  90.     pthread_mutex_unlock(&mutex);
  91.     return obj;
  92. }

  93. template <class Object>
  94. void ThreadQueue<Object>::Clear()
  95. {
  96.     pthread_mutex_lock(&mutex);
  97.     while (!que.empty())
  98.     {
  99.       que.pop();
  100.     }
  101.     size = 0;
  102.     pthread_mutex_unlock(&mutex);
  103. }

  104. int main()
  105. {
  106. //      ThreadQueue<UserSendCache> t = new ThreadQueue<UserSendCache>();//这个也不行
  107.         ThreadQueue<UserSendCache> t();
  108.         const UserSendCache* d = new UserSendCache();
  109.         t.Push(d);
  110.     return 0;
  111. }
复制代码
在坛里找到了这个队列代码,咋用?
ThreadQueue<UserSendCache> t = new ThreadQueue<UserSendCache>();
用这个代码编译直接报
/usr/include/c++/5/bits/stl_construct.h:93:对‘UserSendCache::~UserSendCache()’未定义的引用
/usr/include/c++/5/bits/stl_construct.h:93:对‘UserSendCache::~UserSendCache()’未定义的引用
/usr/include/c++/5/bits/stl_construct.h:93:对‘UserSendCache::~UserSendCache()’未定义的引用
/usr/include/c++/5/bits/stl_construct.h:93:对‘UserSendCache::~UserSendCache()’未定义的引用
/usr/include/c++/5/bits/stl_construct.h:93:对‘UserSendCache::~UserSendCache()’未定义的引用
gateway/src/ThreadQueue.o:/usr/include/c++/5/bits/stl_construct.h:93: 跟着更多未定义的参考到 UserSendCache::~UserSendCache()
collect2: error: ld returned 1 exit status

用这个ThreadQueue<UserSendCache> t();

error: request for member ‘Push’ in ‘t’, which is of non-class type ‘ThreadQueue<UserSendCache>()’

论坛徽章:
6
技术图书徽章
日期:2013-11-13 11:11:27子鼠
日期:2014-02-20 17:54:13处女座
日期:2014-06-16 17:43:33午马
日期:2014-08-08 09:11:17未羊
日期:2014-08-10 11:57:072015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2016-04-11 08:58 |只看该作者
吐槽不能。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2016-04-12 10:04 |只看该作者
不会用模板呀,没人告诉我?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2016-04-12 11:17 |只看该作者
哎,注意到了,原来少了UserSendCache的构造和析构,开始以为是ThreadQueue少了,看代码又有,搞得我折腾了半天

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2016-04-12 11:18 |只看该作者
话说,这么明显的,坛子里也没人帮忙看下,有时候钻进去一下子出不来~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP