Synchronization 信号量的一致数是多少?

Synchronization 信号量的一致数是多少?,synchronization,pthreads,mutex,semaphore,condition-variable,Synchronization,Pthreads,Mutex,Semaphore,Condition Variable,(我认为)互斥的最大值是2 信号量(如pthread_sem_*)的一致数是多少 条件变量(如pthread_cond_*)的一致数是多少?当然是无限的?但他们不是免费的 也许我误解了。你说互斥体的一致数是2-你的来源是什么?它被设计成允许任意数量的线程共享一个资源,但要权衡阻塞 Atomic的一致数为2,但不阻塞 澄清一下:信号量、互斥量等都是原语,您可以简单地围绕共享资源使其安全(只要操作正确)。他们可能会阻止,但他们会保证您的数据是安全的 您所引用的论文是关于保护数据而不阻塞所需的原语的

(我认为)互斥的最大值是2

信号量(如pthread_sem_*)的一致数是多少


条件变量(如pthread_cond_*)的一致数是多少?

当然是无限的?但他们不是免费的

也许我误解了。你说互斥体的一致数是2-你的来源是什么?它被设计成允许任意数量的线程共享一个资源,但要权衡阻塞

Atomic的一致数为2,但不阻塞


澄清一下:信号量、互斥量等都是原语,您可以简单地围绕共享资源使其安全(只要操作正确)。他们可能会阻止,但他们会保证您的数据是安全的


您所引用的论文是关于保护数据而不阻塞所需的原语的,这是一个很好的例子。同样的原语也可能对锁有用,但这只是一个很好的补充。

仅从本文中,您就可以得出结论,信号量的一致数必须小于或等于2。原因如下:

在文章的第三页,他们说:“fetch&add操作非常灵活:它可以用于信号量……”。因为我们知道fetch&add的一致数等于2,所以该论文的定理1可以用来证明信号量的一致数必须小于或等于2。证据是这样的:


证明 假设存在通过fetch&add实现的无等待信号量。进一步假设信号量的一致数大于2。我们知道fetch&add的一致数为2。从定理1我们可以得出结论,在一个有两个以上进程的系统中,不存在通过fetch&add实现信号量的无等待实现。这与fetch&add实现存在的假设相矛盾。因此,信号量的一致数必须小于或等于2


QED

互斥锁的一致数为1。很明显,互斥锁对于单个线程是无等待的。从定义上看,互斥体不再是两个线程的无等待状态。因此一致数>=1,答案取决于互斥或信号量上支持的操作。如果只支持阻塞锁,则一致数为1。如果一个线程可以尝试在不等待的情况下锁定互斥锁,则一致数为2。这是因为如果有两个线程,两个线程都可以尝试锁定互斥锁,两个线程都可以同意哪一个线程获得互斥锁,因此有共识。如果互斥体可以另外确定,对于任意数量的线程,哪个线程锁定了它,那么一致数是无限的。我认为信号灯的情况是类似的。互斥量相当于计数器为1的信号量。我不认为只用更大的计数器就可以达成共识,它仍然可以归结为相同的操作。Pthreads支持非阻塞锁,但不支持查询,因此答案是2


如果任何线程没有等待条件变量,则向其发送信号不会起任何作用,因此它们具有一致性编号1。

什么是“一致性编号”?我认为信号量是一个挥舞旗帜的信号系统。比如,“救命啊,我们的船要沉了!”:)那张纸看起来太棒了。我想知道为什么我以前没见过它。这篇论文规定得太多了,在我看来,它阻止了其他人研究类似的问题。。。对于DSM同步理论来说太糟糕了。。我很确定你不能用互斥体实现信号量,你还需要条件变量或其他方法来自动解锁互斥体并进入队列。最后一步没有完成。我可以通过比较和交换实现互斥。这就是无限吗?或者我可以实现一个只有一个集合的互斥,这对于一个进程来说是安全的。本文的重点是研究非阻塞原语,而互斥不是。@Helltone证明不依赖于使用互斥实现信号量;它依赖于获取和添加。然而,你错了:你可以用互斥实现信号量。我不明白为什么依赖条件变量来实现意味着你不能实现它。你也许是对的。。。我认为互斥锁的一致数为2,因为我只能用test&set实现它。我认为不可能只使用互斥体实现信号量。我需要比这更强大的东西,比如条件变量,所以互斥体的“最小”一致数是2。信号量的“最小”一致数是多少?但互斥锁的实现不会是无等待的。你会对助教的指令感兴趣。(抱歉,不小心删除了那条评论)我必须承认,我只是浏览了这篇论文,但它是关于分析无等待同步的。我不认为共识数字真的与任何阻碍因素有关。