(1)原子操作:单条指令
(2)多条指令原子操作(临界区):锁(内存屏障+原子变量)
(3)CAS也是一种原子操作(不同ARCH都有对应的指令实现)——CAS要知道变量的当前值的前提下才能重新设置变量的值
(4)CAS的引入可以实现无锁编程
(5)有锁编程和无锁编程的区别
a. 有锁编程:如果当前获取锁的线程被中断,其他等待锁的线程也就停下来,直到被中断的线程中断返回,继续执行释放锁后,其他线程才能继续获取锁运行;
b. 无锁编程当前线程被中断不影响其他线程运行;
c. 无锁编程示例:
EnQueue(Q, data) //进队列
{
//准备新加入的结点数据
n = new node();
n->value = data;
n->next = NULL;
do {
p = Q->tail; //取链表尾指针的快照
} while( CAS(p->next, NULL, n) != TRUE);
//while条件注释:如果没有把结点链在尾指针上,再试
CAS(Q->tail, p, n); //置尾结点 tail = n;
}
题外话(6)不仅仅是原子变量,CAS也可以用来实现锁: