Multithreading 通过测试和设置原子操作实现互斥:它能在超过2个线程中工作吗?
我正在读维基百科关于原子操作的文章。它说实现互斥的一种方法是使用基于测试和集合的锁 然而,根据同一篇文章,测试集操作有一个有限的一致数,并且最多可以解决两个并发进程的无等待一致性问题 那么,基于测试和设置操作的互斥锁是否只适用于两个线程?如果是,如何实现“实际”互斥体Multithreading 通过测试和设置原子操作实现互斥:它能在超过2个线程中工作吗?,multithreading,concurrency,language-agnostic,atomic,test-and-set,Multithreading,Concurrency,Language Agnostic,Atomic,Test And Set,我正在读维基百科关于原子操作的文章。它说实现互斥的一种方法是使用基于测试和集合的锁 然而,根据同一篇文章,测试集操作有一个有限的一致数,并且最多可以解决两个并发进程的无等待一致性问题 那么,基于测试和设置操作的互斥锁是否只适用于两个线程?如果是,如何实现“实际”互斥体 需要注意的一点是,互斥本质上相当于两个线程的共识。换句话说,实现互斥并不需要n线程共识s评论 我强烈推荐莫里斯·赫利希和尼尔·沙维特的作品。实际上,引用Herlihy的话来说明“test和set有一个有限的一致数,最多可以解决两个
需要注意的一点是,互斥本质上相当于两个线程的共识。换句话说,实现互斥并不需要n线程共识s评论 我强烈推荐莫里斯·赫利希和尼尔·沙维特的作品。实际上,引用Herlihy的话来说明“test和set有一个有限的一致数,最多可以解决两个并发进程的无等待一致性问题” 本书的第5章讨论了使用原始同步操作的一致性,但我相信第7章会引起您的兴趣:它们讨论了如何使用TAS(测试和设置)指令在Java中实现锁。 第145页的扰流板:
public类TASLock实现锁{
AtomicBoolean状态=新的AtomicBoolean(false);
公共无效锁(){
而(state.getAndSet(true)){}
}
公开作废解锁(){
state.set(false);
}
}
那么,基于测试和设置操作的互斥锁是否只适用于两个线程
简单的答案是:不,它们工作于两个以上的线程
如果是,如何实现“实际”互斥体
同一个维基百科页面引用CAS()作为TAS更强大的替代品,但该书对此问题进行了广泛的讨论。
此外,SO中已经提出了这一问题,因此我建议通读的答案,“正确”的解决方案是使用具有以下属性的“不间断模式”标志:
希望这是有意义的!
测试和设置
当然可以用于实现两个以上线程的互斥。它们的要点似乎是,如果线程数较高,则无法再“无等待”(即在有限的步骤数内)完成互斥需要注意的一点是互斥本质上相当于两个线程的一致性。换句话说,实现互斥不需要n线程一致性。我想你是想写“它可以为两个以上的线程提供共识,但不能以无等待的方式。对于两个以上的线程,绝对可以使用TA以无等待的方式解决互斥问题,因为解决互斥问题相当于解决两个线程的共识(我是否可以进入关键部分?)@Eric,你是对的。我试图将事情过于简单化,但犯了一个错误。为了保持简单,我删除了答案的这一部分,并复制了你在问题中的评论。关于这个问题的更详细解释可以在答案中提到的部分中找到。