如何衡量Linux上无锁比较和交换循环中的争用?

时间:2017-02-10 17:13:41

标签: concurrency profiling lock-free

假设我们以简单的无锁方式将节点插入到列表中。假设我们从对象池中回收节点,这样我们就不必使用危险指针等。 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发送事件?

0 个答案:

没有答案