- 论坛徽章:
- 14
|
本帖最后由 lxyscls 于 2015-11-04 18:10 编辑
之前的enqueue有问题
现在这个编译都不过
一楼free-list代码- #ifndef __FREELIST_HPP__
- #define __FREELIST_HPP__
- #include <cstdlib>
- #include <atomic>
- #define DUMMY -1
- using namespace std;
- template <typename T> class list;
- template <typename T>
- class item {
- friend class list<T>;
- private:
- item(const T &t) : data(t) { next.store(NULL); }
- T data;
- atomic<item<T> *> next;
- };
- template <typename T>
- class list {
- public:
- list();
- void Enqueue(const T&);
- T Dequeue(void);
- private:
- atomic<item<T> *> head;
- atomic<item<T> *> tail;
- };
- template <typename T>
- list<T>::list()
- {
- item<T> *i = new item<T>(DUMMY);
- head.store(i);
- tail.store(i);
- }
- template <typename T>
- void list<T>::Enqueue(const T &t)
- {
- item<T> *p, *q = new item<T>(t);
- do {
- p = tail.load();
- } while (p->next.compare_exchange_weak((item<T> *)NULL, q) != true);
- tail.compare_exchange_weak(p, q);
- }
- template <typename T>
- T list<T>::Dequeue(void)
- {
- item<T> *p, *q;
- do {
- p = head.load();
- q = p->next.load();
- if (q == NULL)
- return DUMMY;
- } while (head.compare_exchange_weak(p, q) != true);
- return q->data;
- }
- #endif
复制代码 |
|