Guest User

Untitled

a guest
Dec 8th, 2016
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.06 KB | None | 0 0
  1. #include <thread>
  2. #include <atomic>
  3. #include <deque>
  4. #include <condition_variable>
  5. #include <mutex>
  6.  
  7. using namespace std;
  8.  
  9. template<typename T>
  10. class lock_free_queue {
  11.  
  12.     struct Node {
  13.         atomic<Node*> next;
  14.         T value;
  15.         Node() { next = nullptr; }
  16.         Node(T nvalue) : value(nvalue) { next = nullptr; }
  17.         Node(T &&nvalue) : value(nvalue) {
  18.             next = nullptr;
  19.         }
  20.     };
  21.  
  22.     atomic<Node *> head, tail, base_head;
  23.  
  24.  
  25. public:
  26.     lock_free_queue() {
  27.         base_head = tail = head = new Node();
  28.     }
  29.  
  30.     void enqueue(T v) {
  31.         Node *new_node = new Node(v), *cur_tail, *cur_tail_next;
  32.         while (true) {
  33.             cur_tail = tail.load();
  34.             cur_tail_next = cur_tail->next.load();
  35.             if (!cur_tail_next) {
  36.                 if (tail.load()->next.compare_exchange_strong(cur_tail_next, new_node))
  37.                     break;
  38.             } else {
  39.                 tail.compare_exchange_strong(cur_tail, cur_tail_next);
  40.             }
  41.         }
  42.         tail.compare_exchange_strong(cur_tail, new_node);
  43.     }
  44.  
  45.     bool dequeue(T &result) {
  46.         Node *cur_head, *cur_tail, *cur_head_next;
  47.         while (true) {
  48.             cur_head = head.load();
  49.             cur_tail = tail.load();
  50.             cur_head_next = cur_head->next.load();
  51.             if (cur_head == cur_tail) {
  52.                 if (!cur_head_next) {
  53.                     return false;
  54.                 } else {
  55.                     tail.compare_exchange_strong(cur_head, cur_head_next);
  56.                 }
  57.             } else {
  58.                 if (head.compare_exchange_strong(cur_head, cur_head_next)) {
  59.                     result = cur_head_next->value;
  60.                     //delete cur_head;
  61.                     return true;
  62.                 }
  63.             }
  64.         }
  65.     }
  66.  
  67.     ~lock_free_queue() {
  68.         Node * ptr = nullptr;
  69.         while (base_head.load() != nullptr) {
  70.             ptr = base_head.load();
  71.             base_head.exchange(base_head.load()->next);
  72.             delete ptr;
  73.         }
  74.     }
  75. };
Add Comment
Please, Sign In to add comment