门票锁是否等待无限? (在某些假设下)

时间:2011-10-11 14:03:28

标签: concurrency synchronization terminology

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

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

假设这样的票证锁定同步访问无等待的关键部分S,即执行关键部分正好采用c个周期/指令。假设系统中最多有p个线程,是否使用机票锁定等待S的同步?

在我看来,由于票证锁定是公平的,因此等待的上限是O(p * c)。

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

但是,如果在上述假设下,票证锁定(以及可能是任何其他公平锁定机制)是无限制的,它(可能)可以构建有限等待队列的实现,堆叠等(这是我实际面临的问题。)


回想一下Herlihy和Shavit的“多处理器编程艺术”中的有限等待定义,p.59:

“如果一个方法保证每个调用都以有限的步数完成它的执行,那么该方法是无等待的。如果方法调用可以采取的步数有一个限制,它就是无限制的。” / p>

1 个答案:

答案 0 :(得分:1)

嗯,我相信你是对的,有一些警告。

即,只有当临界区S是非抢占式时,有界无等待属性才会成立,我认为只能保证内核空间代码(通过禁用临界区中的中断)。否则操作系统可能决定在一个线程处于临界区时切换到另一个线程,然后等待时间无限制,不是吗?

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