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中已经提出了这一问题,因此我建议通读

的答案,“正确”的解决方案是使用具有以下属性的“不间断模式”标志:

  • 原子读写(使用test和set操作符)
  • 设置此选项后,应用程序在任何情况下(线程重新调度等)都不能中断
  • 在互斥锁上,通过原子测试/设置标志(设置标志时旋转或休眠),进入不间断模式,然后获取互斥锁或进入队列进行操作(在后一种情况下,当前线程无法重新进入调度程序的就绪队列。)解锁时,进入不可中断模式,并将互斥对象放弃给队列中的下一个线程(如果有)

    我认为libpthread和类似的工具就是以这种方式实现互斥体的。从本质上来说,这并不难做到,但解决方案要么完全正确,要么完全不正确


    希望这是有意义的!

    测试和设置
    当然可以用于实现两个以上线程的互斥。它们的要点似乎是,如果线程数较高,则无法再“无等待”(即在有限的步骤数内)完成互斥需要注意的一点是互斥本质上相当于两个线程的一致性。换句话说,实现互斥不需要n线程一致性。我想你是想写“它可以为两个以上的线程提供共识,但不能以无等待的方式。对于两个以上的线程,绝对可以使用TA以无等待的方式解决互斥问题,因为解决互斥问题相当于解决两个线程的共识(我是否可以进入关键部分?)@Eric,你是对的。我试图将事情过于简单化,但犯了一个错误。为了保持简单,我删除了答案的这一部分,并复制了你在问题中的评论。关于这个问题的更详细解释可以在答案中提到的部分中找到。