我所说的票证锁可能如下(伪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>
答案 0 :(得分:1)
嗯,我相信你是对的,有一些警告。
即,只有当临界区S是非抢占式时,有界无等待属性才会成立,我认为只能保证内核空间代码(通过禁用临界区中的中断)。否则操作系统可能决定在一个线程处于临界区时切换到另一个线程,然后等待时间无限制,不是吗?
另外,对于内核代码,我认为p不是软件线程的数量,而是硬件线程的数量(或核心,对于每个CPU核心不支持多个线程的CPU)。因为最多只有一个p软件线程可以一次运行,并且由于S是非抢占式的,所以你没有等待锁定的休眠线程。