如何在C中创建线程的被动等待FIFO?
Posted
技术标签:
【中文标题】如何在C中创建线程的被动等待FIFO?【英文标题】:How to create a passive waiting FIFO of thread in C? 【发布时间】:2018-05-14 11:42:22 【问题描述】:我正试图找出一种方法让一些线程处于被动等待模式,并在它们到达屏障时唤醒它们。我有固定数量的线程应该到达。
我首先考虑的是一个信号量,我将其初始化为 0,因此它会阻塞,但它们会以随机方式释放。我想实现一个系统,该系统将按照进入同步障碍的顺序释放线程,如 FIFO。
我还考虑过使用 2 个信号量,它会阻塞、释放一个线程并对其进行排序。如果线程是好的线程,那么它就会运行,如果不是,那么它会被第二个信号量阻塞。然而,这个系统似乎有点冗长和挑剔。
有人有什么想法或建议可以帮助我吗?
非常感谢:)
【问题讨论】:
'我想要' - 这是一个严格的要求吗?如果没有,那是可以避免的混乱。一般来说,执行命令,如你所建议的,是最好避免的设计。可以这样做,但是由于从屏障释放的任何线程 X 都可能被随后立即释放的线程 X+1 抢占,因此您的“喜欢”并不是真正可执行或有用的。 我的意思是,如果你真的需要做很多额外的系统调用,这些调用不能提供任何保证和微不足道的优势,让它们都进入一个 CS,除了最后一个得到一个信号量,把 sema 放到一个队列容器,退出 CS 并阻塞 sema。当最后一个线程进入时,它可以使信号量出队,按顺序发出信号,退出CS本身并继续。 Re,“将某个线程置于被动等待模式,并在它们到达屏障时唤醒它们。”这是没有意义的。只要线程被动地等待某事,它就永远不会“到达障碍”。通常,当您说“障碍”时,您指的是“到达障碍”是导致线程等待的原因。 我猜最坏的情况是当最后一个线程进入锁并发现它是最后一个时没有空闲内核:)它按顺序发出所有信号量,使所有其他线程准备好了,但它们没有设置运行,因为没有可用的内核。然后最后一个线程退出 CS 并首先运行。 X Y Problem? 为什么您希望线程以这种方式运行?任何将线程行为如此紧密耦合的尝试都必然是解决问题的低效和/或笨拙的解决方案。您真正想要解决的是什么问题? 【参考方案1】:在 Linux 上,您可以只使用条件变量和互斥锁以相同的 FIFO 顺序阻塞和取消阻塞线程。
这是因为条件变量上的所有等待者都按顺序附加到内核中的 futex 等待队列中。唤醒服务员以相同的 FIFO 顺序发生。只要您在发出条件变量信号时保持互斥锁锁定。
但是,正如评论者所说,依赖线程执行顺序是一个糟糕的主意。
【讨论】:
谢谢。我同意它没有效率。这实际上是我的一个任务。每个线程都应该代表等候室中的客户。所以它在等待期间不能使用 CPU 资源。每个客户都必须按照到达的顺序被释放。以上是关于如何在C中创建线程的被动等待FIFO?的主要内容,如果未能解决你的问题,请参考以下文章