Concurrency 如何在Linux上测量无锁比较和交换循环中的争用?
假设我们以一种简单的无锁方式将一个节点插入到列表中。假设我们正在从对象池中回收节点,这样我们就不必使用危险指针之类的东西Concurrency 如何在Linux上测量无锁比较和交换循环中的争用?,concurrency,profiling,lock-free,Concurrency,Profiling,Lock Free,假设我们以一种简单的无锁方式将一个节点插入到列表中。假设我们正在从对象池中回收节点,这样我们就不必使用危险指针之类的东西cas\u failure会使用暂停指令或系统调用,如sched\u yield(这当然不适用于需要真正无锁而不是快速的代码。) 如何使用性能分析工具来监视此类循环中的争用量 是否可以在cas\u failure中调用函数将事件发送到Linux的perf?在代码中(在争用路径中)定义某种跟踪点,例如:或“用户级静态定义跟踪(USDT)”探测。它们在不使用时将为nop,可以用pe
cas\u failure
会使用暂停指令或系统调用,如sched\u yield
(这当然不适用于需要真正无锁而不是快速的代码。)
如何使用性能分析工具来监视此类循环中的争用量
是否可以在
cas\u failure
中调用函数将事件发送到Linux的perf?在代码中(在争用路径中)定义某种跟踪点,例如:或“用户级静态定义跟踪(USDT)”探测。它们在不使用时将为nop,可以用perf
替换为实际事件生成,以便在perf记录中使用。
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();
}
}