由于我本人有些困惑,因此我先澄清问题中的一些概念。
集合。我认为没有理由花时间严格定义“集合”的含义,因为我们可以简单地询问一般情况下数据结构会发生什么。一种数据结构占据一块内存,并有一些操作可以访问该存储器以及可以由被调用的用户。这些用户可能是不同的处理器或只是不同的线程,这与我们无关。重要的是它们可以并行执行操作。
无锁。Herlihy和Boss说,当崩溃的用户没有阻止进一步使用该数据结构时,该数据结构是无锁的。例如,假设有人在将节点插入排序集中的过程中将水倒在处理器上。好吧,如果其他处理器稍后尝试插入该排序集中,则它们应该会成功。(编辑:根据此定义,情况是,如果数据结构使用锁,则它不是无锁的,但情况并非如此,如果数据结构不使用锁,则它是无锁的。)
有了这些定义,我认为Herlihy和Boss基本上说答案是将关键地区转变为交易。
但是,您可能会问,这是否具有相同的复杂性?我不确定这个问题是否有意义。考虑一下push(x) { lock(); stack[size++] = x; unlock(); }
。这是恒定时间的操作吗?如果您忽略锁定操作并因此忽略其他用户,则可以回答“是”。如果您不希望忽略其他用户,那么实际上没有办法说是否推送将在恒定时间内运行。如果您上一级查看某个特定算法如何使用堆栈,那么您也许可以说推入将始终花费恒定的时间(根据并行算法输入的当前值来衡量)。但这确实是算法的一个属性,因此说推入 是恒定时间的操作是没有意义的。
总之,如果您忽略执行某个操作的用户等待其他用户的数量,那么使用事务而不是关键区域肯定会回答您的问题。如果您不忽略等待时间,那么您需要查看如何使用数据结构。