免费注册 查看新帖 |

Chinaunix

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

[C++] lockfree-list C++11 atomic<T> 编译不过,求教@_@ [复制链接]

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-04 18:03 |只看该作者 |倒序浏览
本帖最后由 lxyscls 于 2015-11-04 18:10 编辑

之前的enqueue有问题



现在这个编译都不过

一楼free-list代码
  1. #ifndef __FREELIST_HPP__
  2. #define __FREELIST_HPP__

  3. #include <cstdlib>
  4. #include <atomic>

  5. #define DUMMY -1

  6. using namespace std;

  7. template <typename T> class list;
  8. template <typename T>
  9. class item {
  10.         friend class list<T>;
  11.         private:
  12.                 item(const T &t) : data(t) { next.store(NULL); }
  13.                 T data;
  14.                 atomic<item<T> *> next;
  15. };

  16. template <typename T>
  17. class list {
  18.         public:
  19.                 list();
  20.                 void Enqueue(const T&);
  21.                 T Dequeue(void);
  22.         private:
  23.                 atomic<item<T> *> head;
  24.                 atomic<item<T> *> tail;
  25. };

  26. template <typename T>
  27. list<T>::list()
  28. {
  29.         item<T> *i = new item<T>(DUMMY);
  30.         head.store(i);
  31.         tail.store(i);
  32. }

  33. template <typename T>
  34. void list<T>::Enqueue(const T &t)
  35. {
  36.         item<T> *p, *q = new item<T>(t);

  37.         do {
  38.                 p = tail.load();
  39.         } while (p->next.compare_exchange_weak((item<T> *)NULL, q) != true);

  40.         tail.compare_exchange_weak(p, q);
  41. }

  42. template <typename T>
  43. T list<T>::Dequeue(void)
  44. {
  45.         item<T> *p, *q;

  46.         do {
  47.                 p = head.load();
  48.                 q = p->next.load();
  49.                 if (q == NULL)
  50.                         return DUMMY;
  51.         } while (head.compare_exchange_weak(p, q) != true);

  52.         return q->data;
  53. }

  54. #endif
复制代码

compile_error.JPG (0 Bytes, 下载次数: 26)

compile_error.JPG

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2015-11-04 18:03 |只看该作者
本帖最后由 lxyscls 于 2015-11-04 18:11 编辑

二楼测试代码
  1. #include <thread>
  2. #include <iostream>

  3. #include "freelist.hpp"

  4. using namespace std;

  5. list<int> fl;
  6. thread **prod_threads;
  7. thread **cons_threads;

  8. #define CNT 1000

  9. void producer(void)
  10. {
  11.         for (int i = 0; i < CNT; i++) {
  12.                 fl.Enqueue(i);
  13.         }
  14. }

  15. void consumer(void)
  16. {
  17.         int ret, i = 0;

  18.         while (1) {
  19.                 ret = fl.Dequeue();
  20.                 if (ret != DUMMY) {
  21.                         cout << ret << endl;
  22.                         if (++i == CNT)
  23.                                 break;
  24.                 }
  25.         }
  26. }

  27. int main(int argc, char *argv[])
  28. {
  29.         int prod_num = atoi(argv[1]);
  30.         int cons_num = atoi(argv[2]);

  31.         prod_threads = new thread *[prod_num];
  32.         cons_threads = new thread *[cons_num];

  33.         for (int i = 0; i < prod_num; i++)
  34.                 prod_threads[i] = new thread(producer);

  35.         for (int i = 0; i < cons_num; i++)
  36.                 cons_threads[i] = new thread(consumer);

  37.         for (int i = 0; i < prod_num; i++) {
  38.                 prod_threads[i]->join();
  39.                 delete prod_threads[i];
  40.         }

  41.         for (int i = 0; i< cons_num; i++) {
  42.                 cons_threads[i]->join();
  43.                 delete cons_threads[i];
  44.         }

  45.         delete [] prod_threads;
  46.         delete [] cons_threads;

  47.         return 0;
  48. }
复制代码

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
3 [报告]
发表于 2015-11-04 21:46 |只看该作者
当我看见了“4.7”的时候就懒得再看下去了,你先把那个3岁多的编译器升级到4.9/5.x再来研究这个问题吧。

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2015-11-06 18:21 |只看该作者
本帖最后由 lxyscls 于 2015-11-10 09:48 编辑

回复 3# windoze


    问题还是那个问题,p->next.compare_exchange_weak((item<T> *)NULL, q)
   
    是这个NULL的问题,原来是C++不提供空引用

    使用#define NULLRef(type) (*((type*)(NULL))),p->next.compare_exchange_weak(NULLRef(item<T> *), q)就可以了

    补充一下:atomic函数里面需要查看该地址的值,所以这样也是不行的,需要引入哑元,凸

compile_error.JPG (255.92 KB, 下载次数: 23)

compile_error.JPG
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP