如何'公平'是一个标准的C++原子标志在唤醒线程从wait()对一个notify_one()调用

bprjcwpo  于 2023-08-09  发布在  其他
关注(0)|答案(3)|浏览(94)

当notify_one()被调用时,在atomic_flag上调用wait()的线程被唤醒的顺序是否有任何关于公平性的信息。他们是不是按照进入等待()的确切顺序唤醒的,FIFO可以这么说?
原子标志变量似乎返回“always lock free”。我知道它们在任何实现中都保证是无锁的,但我不确定如果使用wait(),它们是否仍然是无锁的,因此必须有某种机制来决定等待者的唤醒。一些其他的同步方法保证了公平性,但它以后台的内存分配为代价。
有没有人知道这是如何与atomic_flags一起工作的?我改变了我所有的同步器使用原子旗和他们的工作超级快。但是,我忽略了公平性的问题。

  • 谢谢-谢谢
pw9qyyiw

pw9qyyiw1#

没有来自标准的保证,它将取决于标准库的实现。
它甚至不能保证 * 只有 * 一个线程是未阻塞的。任何数量的合格线程,但是如果至少一个合格,则至少一个可以被解除阻止。简单地将notify_one转发到notify_all的实现将是符合的。

4urapxun

4urapxun2#

从几个答案中总结,答案将是:

  • 标准C++规范没有任何与atomic_flags的公平性相关的指导方针,并且可能通过扩展到所有其他原子类型。
  • 每个实现可以在它们认为合适时唤醒等待线程。
  • 使用notify_all()而不是notify_one()将给予所有线程几乎相等的机会来竞争atomic_flag并将其进一步留给调度器。
  • 抢占式线程调度器引导管弦乐队哪个线程获得第一机会。我由此得出结论,使用notify_all(),线程的饥饿可能变得不可能,或者至少问题较少,因为调度程序将为每个线程提供机会。
  • 多核并不能保证同一个线程总是完全在同一个核上执行,所以公平性不会在试图更好地将负载分散在几个核上时带来任何东西。

谢谢大家。现在感觉很好,因为公平是一个比我最初想象/担心的要小的问题。

avkwfej4

avkwfej43#

C++标准在这里没有任何要求--每个实现都可以自由地唤醒它认为最合适的线程。
如果对您很重要的话,您可能希望在您的平台上存在的编译器之间进行比较。

相关问题