假设我们以简单的无锁方式将节点插入到列表中。假设我们从对象池中回收节点,这样我们就不必使用危险指针等。 cas_failure
执行诸如使用暂停指令或系统调用之类的操作,例如sched_yield
(这对于需要真正无锁而不是快速的代码来说当然是不合适的。)
void cas_failure(void);
void cas_success(void);
struct node;
struct aba {
struct node *contents;
uint32_t tag;
};
typedef _Atomic(struct aba) atomic_node;
struct node {
int head;
struct node * tail;
};
atomic_node list_head;
void insert(struct node *new_nodep)
{
for (;;) {
struct aba head = atomic_load(&list_head);
new_nodep->tail = head;
if (atomic_compare_exchange(&list_head, head,
(struct aba){head.tag + 1U, new_nodep})) {
break;
}
cas_failure();
}
}
如何使用性能分析工具来监控此类循环中的争用量?
是否可以调用函数向cas_failure
中的Linux的perf发送事件?