首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >售票锁是免费的吗?(根据某些假设)

售票锁是免费的吗?(根据某些假设)
EN

Stack Overflow用户
提问于 2011-10-11 14:03:28
回答 1查看 490关注 0票数 3

我正在讨论一个票证锁,它看起来可能如下(在伪C语法中):

代码语言:javascript
运行
复制
    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)。

我会犯错吗?我有点困惑。我一直认为锁定意味着不需要等待,因为以下语句:“不可能从一组原子寄存器构建队列、堆栈、优先级队列、set或list的无等待实现。”(推论5.4.1多处理器编程艺术,Herlihy和Shavit)

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

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

“方法是无等待的,如果它保证每个调用都在有限的步骤中完成它的执行。如果一个方法调用所能采取的步骤数有一个界,则它是有界的没有等待的。”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-11 15:13:26

好吧,我相信你是对的,还有一些警告。

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

另外,对于内核代码,我认为p不是软件线程的数量,而是硬件线程的数量(或内核,对于每个CPU内核不支持多个线程的CPU)。因为在大多数情况下,p软件线程一次都是可运行的,而且由于S是非抢占性的,所以在锁上没有休眠线程等待。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7727304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档