Concurrency 票锁是免费的吗?(在某些假设下)

Concurrency 票锁是免费的吗?(在某些假设下),concurrency,synchronization,terminology,Concurrency,Synchronization,Terminology,我所说的票证锁可能如下所示(在伪C语法中): 让我们假设这样一个票证锁同步了对无等待的关键部分的访问,即执行关键部分正好需要c周期/指令。假设系统中最多有p个线程,那么使用票证锁的S的同步是无等待的吗 在我看来,这是因为票锁是公平的,因此等待的上限是O(p*c) 我会犯错吗?我有点困惑。我一直认为锁定意味着不能(有界)无等待,因为下面的语句: “从一组原子寄存器构造队列、堆栈、优先级队列、集合或列表的无等待实现是不可能的。”(Herlihy和Shavit《多处理机编程技术》中的推论5.4.1)

我所说的票证锁可能如下所示(在伪C语法中):

让我们假设这样一个票证锁同步了对无等待的关键部分的访问,即执行关键部分正好需要c周期/指令。假设系统中最多有p个线程,那么使用票证锁的S的同步是无等待的吗

在我看来,这是因为票锁是公平的,因此等待的上限是O(p*c)

我会犯错吗?我有点困惑。我一直认为锁定意味着不能(有界)无等待,因为下面的语句: “从一组原子寄存器构造队列、堆栈、优先级队列、集合或列表的无等待实现是不可能的。”(Herlihy和Shavit《多处理机编程技术》中的推论5.4.1)

然而,如果票证锁(可能还有任何其他公平锁定机制)在上述假设下是有界无等待的,那么它(可能)可以构造队列、堆栈等的有界无等待实现(这是我实际面临的问题)


回想一下Herlihy和Shavit在“多处理器编程艺术”第59页中对有界无等待的定义:


“如果一个方法保证每个调用在有限的步骤中完成其执行,那么它是无等待的。如果一个方法调用可以采取的步骤数量有一个界限,那么它是有界限的无等待的。”

好吧,我相信你是正确的,但有一些警告

也就是说,只有在关键部分S是非抢占的情况下,有界无等待属性才有效,我想您只能为内核空间代码保证这一点(通过禁用关键部分中的中断)。否则,当一个线程处于关键部分时,操作系统可能会决定切换到另一个线程,然后等待时间是无限的,不是吗


另外,对于内核代码,我假设p不是软件线程的数量,而是硬件线程的数量(或内核,对于不支持每个CPU内核几个线程的CPU)。因为最多p个软件线程一次都可以运行,而S是非抢占的,所以没有休眠线程等待锁定。

。关于5.4.1,一个关键点是锁所需的一致性是2一致性(可通过原子寄存器满足),而上述数据结构的无等待构造需要无限一致性,因此CAS或LL/SC。
    unsigned int ticket_counter = 0, lock_counter = 0;

void lock() {
    unsigned int my_ticket = fetch_and_increment(ticket_counter);

    while (my_ticket != lock_counter) {}
}

void unlock() {
    atomic_increment(lock_counter);
}