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();
    }
 }