介绍
无锁队列
先大致介绍一下无锁队列。无锁队列的根本是CAS函数——CompareAndSwap,即比较并交换,函数功能可以用C++函数来说明:
int compare_and_swap (int* reg, int oldval, int newval)
{
int old_reg_val = *reg;
if (old_reg_val == oldval)
*reg = newval;
return old_reg_val;
}
它将reg的值与oldval的值进行对比,若相同则将reg赋新值。注意以上操作是原子操作。大部分语言都有提供CAS支持,不过函数原型可能有些微的不同,许多语言(包括go)中CAS的返回值是标识是否赋值成功的bool值。
无锁队列则是以CAS来实现同步的一种队列,我的具体实现这里就不贴出来了,有点冗长,文末给出了源码地址。这里仅仅大致给出实现思路,网上关于无锁队列的资料很多,这里就不详细说了。
EnQueue(x) //进队列改良版
{
q = new record();
q->value = x;
q->next = NULL;
p = tail;
oldp = p
do {
while (p->next != NULL)
p = p->next;
} while( CAS(p.next, NULL, q) != TRUE); //如果没有把结点链在尾上,再试
CAS(tail, oldp, q); //置尾结点
}
DeQueue(