usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;namespacejf_lockfreequeue{ Public classLockfreequeue<t> { Private classNode<t> { PublicT value; PublicNode<t>Next; } PrivateNode<t>Head; PrivateNode<t>tail; Private intcount; PublicLockfreequeue () {head=NewNode<t>(); Tail=Head; } Public intCount {Get{returncount;} } Public voidEnQueue (T item) {varnode =NewNode<t>(); Node.value=item; Node.next=NULL; Node<T> Tmptail =NULL; BOOLIsreplace =false; Do{Tmptail=tail; while(Tmptail.next! =NULL) {Tmptail=Tmptail.next; } varresult = Interlocked.compareexchange<node<t>> (refTmptail.next, node,NULL); Isreplace= result! =Tmptail.next; } while(!isreplace); Interlocked.exchange<Node<T>> (reftail, node); Interlocked.Increment (refcount); } PublicT Dequeue () {BOOLIsreplace =false; Node<T> Tmphead =NULL; Node<T> Oldheadnext =NULL; Do{Tmphead=Head; Oldheadnext=Tmphead.next; if(Oldheadnext = =NULL) { return default(T); } Else { varresult = Interlocked.compareexchange<node<t>> (refHead, Oldheadnext, Tmphead); Isreplace= result! =Oldheadnext; } } while(!isreplace); Interlocked.decrement (refcount); returnOldheadnext.value; } }}
C # no Lock queue