comparison Implab/Parallels/MTQueue.cs @ 80:4f20870d0816 v2

added memory barriers
author cin
date Fri, 26 Sep 2014 03:32:34 +0400
parents 1714fd8678ef
children dc4942d09e74
comparison
equal deleted inserted replaced
79:05e6468f066f 80:4f20870d0816
16 16
17 Node m_first; 17 Node m_first;
18 Node m_last; 18 Node m_last;
19 19
20 public void Enqueue(T value) { 20 public void Enqueue(T value) {
21 Thread.MemoryBarrier();
22
21 var last = m_last; 23 var last = m_last;
22 var next = new Node(value); 24 var next = new Node(value);
23 25
24 while (last != Interlocked.CompareExchange(ref m_last, next, last)) 26 while (last != Interlocked.CompareExchange(ref m_last, next, last))
25 last = m_last; 27 last = m_last;
33 public bool TryDequeue(out T value) { 35 public bool TryDequeue(out T value) {
34 Node first; 36 Node first;
35 Node next = null; 37 Node next = null;
36 value = default(T); 38 value = default(T);
37 39
40 Thread.MemoryBarrier();
38 do { 41 do {
39 first = m_first; 42 first = m_first;
40 if (first == null) 43 if (first == null)
41 return false; 44 return false;
42 next = first.next; 45 next = first.next;