CAS无锁操作
发布时间:2020-12-15 23:19:47 所属栏目:安全 来源:网络整理
导读:https://coolshell.cn/articles/8239.html 主要讲的是《Implementing Lock-Free Queues》的论点,具体直接看论文最好。这里总结些要点。 CAS就是Compare And Swap。gcc可以调用: 1 __sync_bool_compare_and_swap 这段代码讲出无锁的两个关键手段: 1 EnQueu
https://coolshell.cn/articles/8239.html 主要讲的是《Implementing Lock-Free Queues》的论点,具体直接看论文最好。这里总结些要点。 CAS就是Compare And Swap。gcc可以调用: 1 __sync_bool_compare_and_swap
这段代码讲出无锁的两个关键手段: 1 EnQueue(x) //进队列 2 { 3 //准备新加入的结点数据 4 q = new record(); 5 q->value = x; 6 q->next = NULL; 7 8 do { 9 p = tail; //取链表尾指针的快照 10 } while( CAS(p->next,NULL,q) != TRUE); //如果没有把结点链在尾指针上,再试 11 12 CAS(tail,p,q); //置尾结点 13 } 一个就是CAS,一个就是Retry-Loop。 然后,还有一个ABA问题,就是在被抢占之前和之后数据地址没变,但是数据内容可能变了。解决思路就是加一个额外的状态来记录(也可以用记数)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |