我的当前状态的变量的理解是,所有阻塞(等待)螺纹插入到基本FIFO队列,所述第一项,其中被唤醒时信号()被调用。

是否有任何方式来修改该队列(或创建一个新的结构)作为一个优先级队列,而不是执行?我一直在思考了一段时间,但大多数解决方案我最终被固有的C.V.的和互斥现有的队列结构受到阻碍。

谢谢!

有帮助吗?

解决方案

我想你应该重新考虑你想要做什么。如果你想优化你的表现,你可能找错了树。

pthread_cond_signal() 甚至不保证解除恰好一个螺纹 - 它保证疏通的至少的一个线程,因此您的代码更好的能够处理多个线程畅通,同时的情况。做到这一点的典型方法是为每个线程成为畅通后重新检查条件,并且,如果假的,再次返回到等待。

您可以实现某种形式的计划,你一直在等待的线程自己的优先级队列,每个线程加入自己该队列之前有人开始等待,然后疏通时,它会检查队列,但这会添加了很多复杂性和很多严重的问题(竞争条件,死锁等)的潜力。它也增加开销的一个非平凡量。

此外,如果一个高优先级的线程开始在同一时刻等待条件变量条件变量被信号会发生什么?谁得到畅通,新到的高优先级的线程或前最高优先级的线程?

这线程得到畅通的顺序是完全依赖于内核的线程调度,让你在它的摆布。我甚至不会承担FIFO排序,无论是。

其他提示

由于条件变量基本上只是一个屏障,你有过等待线程队列中没有控制有应用的优先级没有真正的方法。这是无效的假设等待的线程将在FIFO方式起作用。

使用原子能,附加条件变量的组合,以及涉及你可以构造一个解决方案,其中用信号发送的线程将再次用信号通知主CV然后重新块上的优先权CV但它的螺纹/优先级的预先知识肯定不会是一个通用的解决方案。这也是我的头的顶部,也可能有一些其他的缺陷。

这是确定哪些线程将要运行的调度器。你可以看一下 pthread_setschedparam 和的 pthread_getschedparam 和拨弄的策略(SCHED_OTHERSCHED_FIFO,或SCHED_RR)和优先级。但它可能不会让你的地方,我怀疑你想去的地方。

听起来好像你想的东西从固有的非确定性预测的。安德鲁指出,你可能入侵的东西,但我的猜测是,这会导致心痛,否则你会恨自己为六个月(或两者)编写大量的代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top