【问题标题】:What exactly is the meaning of "wait-free" in boost::lockfree?boost::lockfree 中的“wait-free”到底是什么意思?
【发布时间】:2021-03-05 19:23:01
【问题描述】:

我正在阅读 spsc_queue 的文档,即使在其他地方阅读了一些内容后,我也不完全相信“无需等待”的含义。

它们在这里到底是什么意思

bool push(T const & t);

将对象 t 推送到环形缓冲区。

注意:线程安全且无需等待

我的意思是同步必须有一些开销。是

some_spscqueue.push(x);

保证花费恒定的时间?它与非线程安全队列相比如何?

PS:别担心,我会测量,但由于我天真无知,我无法想象一个不涉及某种等待的同步机制,我很困惑“无等待”应该告诉什么我。

【问题讨论】:

  • 你试过维基百科吗? en.wikipedia.org/wiki/Non-blocking_algorithm
  • @NeilButterworth 是的,我做到了,但是例如“如果每个操作在操作完成之前算法将采取的步数都有限制,则该算法是无等待的。”我不完全理解这与使用锁以及确保没有死锁的可能性有何不同。
  • 原则上,你仍然缺少饥饿 - 无等待算法不能被饿死,但互斥锁很容易被饿死(即,它们通常不会表现出“公平”的调度行为高竞争)。在实践中,互斥体的成本更高(由于停车和服务员队列)。在某些情况下您想要停车,这是一种好处,但排长队可能不是其中之一。

标签: c++ boost nonblocking lock-free wait-free


【解决方案1】:

并发数据对象的无等待实现是一种保证任何进程都可以在有限的步骤中完成任何操作,而不管其他进程的执行速度如何。

(来自 Herlihy 文章的abstract)。

另请参阅Wikipedia,以及通过在搜索引擎中输入“wait free”立即找到的所有其他资源。

所以无等待并不意味着没有延迟,它意味着你永远不会进入阻塞等待状态,并且不能被无限期地阻塞和/或饿死.

换句话说,wait 具有特定的技术含义,即您的线程要么处于停顿状态(并且在某些东西唤醒它之前不会执行任何指令),要么处于循环中等待某些外部条件满足(例如自旋锁)。如果它从未被唤醒,或者如果它被唤醒但总是发现它无法继续并且必须再次等待,或者如果循环永远不会退出,那么你的线程正在被饿死并且无法取得进展.

每个操作都有一些延迟,而无等待并没有说明任何关于那是什么。

与非线程安全队列相比如何?

它几乎肯定会比完全不同步的容器更昂贵,因为您仍在做额外的工作(假设您确实只从单个线程访问容器)。

【讨论】:

  • 所以与使用互斥锁的主要区别在于没有机会陷入死锁,但在最坏的情况下,无锁推送可能需要与使用锁一样长的时间?
  • 它几乎肯定会比互斥锁快。它可能与自适应互斥锁的初始自旋锁部分一样长,但无需停车,也无需昂贵的解锁/唤醒路径。但是,这确实意味着更多的线程实际上在做一些事情,这在某些情况下会减慢整个系统的速度。
  • 好的,谢谢,您的编辑更清楚了。我想我会试试看。我没有问的问题是因为我认为它太宽泛/不具体是如何保证生产者不会阻止。让我们看看使用无等待队列我能走多远......
  • @Useless 小心那些泛化,有足够的情况下锁定算法可以比无锁算法快得多。大多数人将“无锁”和“更快”混淆。虽然在特定情况下确实如此,但锁的效率非常高,我已经看到 95% 以上的 CAS 在竞争系统上丢弃了更新。
  • 是的,同意。在无竞争的情况下,如果容器或算法适合它,免等待样式的工作量更少。如果存在争用,或者如果容器或算法不适合免等待风格,那么互斥锁很容易再次占据主导地位。
【解决方案2】:

“将对象推送到环形缓冲区”是指实现队列的数组缓冲区的类型。这可能是使用循环数组来实现的,以将对象存储在队列中。例如:

https://en.wikipedia.org/wiki/Circular_buffer

http://opendatastructures.org/ods-python/2_3_ArrayQueue_Array_Based_.html

【讨论】:

  • 该问题专门针对“免等待”的含义。我知道“推送”是什么意思以及队列是什么。抱歉,如果这不清楚
猜你喜欢
  • 1970-01-01
  • 2017-08-07
  • 2017-07-20
  • 2014-09-23
  • 2014-07-25
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多