在C语言中用条件变量实现优先级队列
我目前对条件变量的理解是,所有阻塞(等待)线程都被插入到基本FIFO队列中,当调用signal()时,第一项被唤醒 有没有办法修改这个队列(或创建一个新的结构)以作为优先级队列执行?我已经考虑了一段时间了,但是大多数解决方案最终都受到C.V.和互斥体固有的现有队列结构的阻碍在C语言中用条件变量实现优先级队列,c,pthreads,priority-queue,condition-variable,C,Pthreads,Priority Queue,Condition Variable,我目前对条件变量的理解是,所有阻塞(等待)线程都被插入到基本FIFO队列中,当调用signal()时,第一项被唤醒 有没有办法修改这个队列(或创建一个新的结构)以作为优先级队列执行?我已经考虑了一段时间了,但是大多数解决方案最终都受到C.V.和互斥体固有的现有队列结构的阻碍 谢谢 由于条件变量基本上只是一个障碍,您无法控制等待线程的队列,因此没有真正的方法应用优先级。假设等待线程将以FIFO方式运行是无效的 通过原子、附加条件变量和所涉及线程/优先级的预先知识的组合,您可以构建一个解决方案,其中
谢谢 由于条件变量基本上只是一个障碍,您无法控制等待线程的队列,因此没有真正的方法应用优先级。假设等待线程将以FIFO方式运行是无效的
通过原子、附加条件变量和所涉及线程/优先级的预先知识的组合,您可以构建一个解决方案,其中一个已发信号的线程将重新发信号给主CV,然后在优先级CV上重新阻塞,但这肯定不是一个通用解决方案。这也是我的想法,因此可能还有其他一些缺陷。由于条件变量基本上只是一个障碍,您无法控制等待线程的队列,因此没有真正的方法应用优先级。假设等待线程将以FIFO方式运行是无效的
通过原子、附加条件变量和所涉及线程/优先级的预先知识的组合,您可以构建一个解决方案,其中一个已发信号的线程将重新发信号给主CV,然后在优先级CV上重新阻塞,但这肯定不是一个通用解决方案。这也是我的想法,所以可能还有其他一些缺陷。是调度程序决定哪个线程将运行。您可以查看和修改策略(
SCHED_OTHER
,SCHED_FIFO
,或SCHED_RR
)和优先级。但这可能不会让你达到我怀疑你想去的地方
听起来好像你想从固有的不确定性中做出一些可预测的东西。正如Andrew指出的,你可能会破解一些东西,但我的猜测是,这会导致心痛,或者你会因为在六个月内(或者两者兼而有之)编写了很多代码而憎恨自己 由调度程序决定运行哪个线程。您可以查看和修改策略(
SCHED_OTHER
,SCHED_FIFO
,或SCHED_RR
)和优先级。但这可能不会让你达到我怀疑你想去的地方
听起来好像你想从固有的不确定性中做出一些可预测的东西。正如Andrew指出的,你可能会破解一些东西,但我的猜测是,这会导致心痛,或者你会因为在六个月内(或者两者兼而有之)编写了很多代码而憎恨自己 我认为你应该重新考虑你想做什么。如果你试图优化你的表现,你可能找错了方向 甚至不能保证只解锁一个线程——它保证至少解锁一个线程,因此您的代码能够更好地处理同时解锁多个线程的情况。执行此操作的典型方法是,每个线程在解除阻塞后重新检查条件,如果为false,则再次返回等待 您可以实现某种方案,让自己的线程优先级队列等待,每个线程在开始等待之前立即将自己添加到该队列中,然后在取消阻止时检查队列,但这会增加很多复杂性,并可能导致严重问题(竞争条件、死锁等)。这也增加了不少开销 另外,如果一个高优先级线程在条件变量发出信号的同时开始等待该条件变量,会发生什么情况?谁被解除了阻塞,是新到达的高优先级线程还是以前的最高优先级线程
线程解除阻塞的顺序完全取决于内核的线程调度程序,因此您可以任由其摆布。我甚至不会假设FIFO顺序。我认为您应该重新考虑您试图做的事情。如果您试图优化性能,您可能找错了方向 甚至不保证只解锁一个线程——它保证至少解锁一个线程,因此您的代码更好地处理同时解锁多个线程的情况。执行此操作的典型方法是每个线程在解锁后重新检查条件,如果为false,则返回等待状态 您可以实现某种方案,让自己的线程优先级队列等待,每个线程在开始等待之前立即将自己添加到该队列中,然后在取消阻止时检查队列,但这会增加很多复杂性,并可能导致严重问题(竞争条件、死锁等)。这也增加了不少开销 另外,如果一个高优先级线程在条件变量发出信号的同时开始等待该条件变量,会发生什么情况?谁被解除了阻塞,是新到达的高优先级线程还是以前的最高优先级线程 线程解除阻塞的顺序完全取决于内核的线程调度程序,所以你可以任由它摆布。我甚至不会假设FIFO顺序