(我认为) 共识编号 对于静音为2。

信号量的共识号是多少(例如pthread_sem_*)?

条件变量的共识号是什么(例如pthread_cond_*)?

有帮助吗?

解决方案

静音的共识编号为1。很明显,单个线程将无需等待。从其定义来看,也很明显,静音不再是两个线程的不再等待。因此,共识编号为> = 1和<2,因此必须为1。

同样,通过停止一个线程以另一个线程而使用的其他同步机制也有数字1,因此不能用于构造由2个线程共享的无等待对象。

其他提示

答案取决于静音或信号量的支持操作。如果仅支持锁定锁,共识号为1。如果线程可以尝试锁定静音而无需等待,则共识号为2。也就是说,因为如果有两个线程,两者都可以尝试锁定mutex,则两者都可以同意哪一个得到了,因此达成共识。如果Mutex可以进一步确定任何数量的线程(线程已锁定),则共识编号是无限的。我认为信号量的情况相似。静音等同于使用计数器1的信号量。我认为只能使用较大的计数器就可以达成共识,但它仍然归结为相同的操作。 Pthreads支持非阻滞锁,但不询问,因此答案将为2。

如果任何线程不等待,则信号变量无能为力,因此它们具有共识数量1。

无限,肯定?但是他们不会等待免费。

也许我误会了。您说Mutex的共识数量为2-您的来源是什么?它旨在允许任何数量的线程共享资源,并与阻塞的权衡。

原子 测试和设置 共识数为2,但没有阻止。


要澄清:信号量,静音等是原始图,您可以简单地将共享资源包裹起来以使其安全(只要您正确地执行)即可。他们可能会阻止,但他们会保证您的数据是安全的。

您引用的论文是关于保护数据所需的原始内容 没有阻止, ,那是 难的. 。相同的原始词也可能对锁有用,但这只是一个不错的额外。

仅凭这篇文章,您就可以得出结论,信号量必须具有小于或等于2的共识编号。这就是为什么:

他们在文章的第三页上说:“获取和添加操作非常灵活:它可用于信号量...”。由于我们知道获取&添加的共识编号等于2,因此可以使用该论文的定理1来证明信号量必须具有小于或等于2的共识数量。证明是这样的:


证明

假设通过获取和添加的存在信号量的候补实现。进一步假设信号量的共识编号大于2。我们知道Fetch&Add的共识数为2。从定理1中,我们可以得出结论,没有通过Fetch&添加2个以上过程的Semaphore的无等待实现。 。这与以下假设相矛盾:通过获取&添加实现。因此,信号量必须具有小于或等于2的共识数。

QED

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top