无锁队列的实现
EnQueue(Q, data) //进队列改良版 v1 { n = new node(); n->value = data; n->next = NULL; p = Q->tail;//两个线程同时取尾节节点 oldp = p
//以下循环的作用是找到真正的尾节点p(因为真正的尾节点可能会被一个线程更新,而tail没有来的及更新),然后将新节点挂到尾节点p的后面 do { while (p->next != NULL)//如果尾节点已经被更新,那么就更新p节点 p = p->next; } while( CAS(p.next, NULL, n) != TRUE); //如果p节点不是尾节点,那么就再去找尾节点的位置 CAS(Q->tail, oldp, n); //置尾结点,虽然此时n不一定是真正的尾节点 }