无锁队列的实现

 

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不一定是真正的尾节点 }

 

 

无锁队列的实现 | 酷 壳 - CoolShell

posted @ 2021-10-06 21:29  Toretto瑞  阅读(41)  评论(0编辑  收藏  举报