当notify_one()被调用时,在atomic_flag上调用wait()的线程被唤醒的顺序是否有任何关于公平性的信息。他们是不是按照进入等待()的确切顺序唤醒的,FIFO可以这么说?
原子标志变量似乎返回“always lock free”。我知道它们在任何实现中都保证是无锁的,但我不确定如果使用wait(),它们是否仍然是无锁的,因此必须有某种机制来决定等待者的唤醒。一些其他的同步方法保证了公平性,但它以后台的内存分配为代价。
有没有人知道这是如何与atomic_flags一起工作的?我改变了我所有的同步器使用原子旗和他们的工作超级快。但是,我忽略了公平性的问题。
- 谢谢-谢谢
3条答案
按热度按时间pw9qyyiw1#
没有来自标准的保证,它将取决于标准库的实现。
它甚至不能保证 * 只有 * 一个线程是未阻塞的。任何数量的合格线程,但是如果至少一个合格,则至少一个可以被解除阻止。简单地将
notify_one
转发到notify_all
的实现将是符合的。4urapxun2#
从几个答案中总结,答案将是:
谢谢大家。现在感觉很好,因为公平是一个比我最初想象/担心的要小的问题。
avkwfej43#
C++标准在这里没有任何要求--每个实现都可以自由地唤醒它认为最合适的线程。
如果对您很重要的话,您可能希望在您的平台上存在的编译器之间进行比较。