小编典典

如何允许某些线程在锁定互斥锁时具有优先级,请使用PTHREADS

linux

假定下面的代码正在由10个线程执行。

pthread_mutex_lock(&lock)
Some trivial code
pthread_mutex_unlock(&lock)

为了便于说明,可以说线程是T1,T2,T3 ....
T10。我的要求是,只要T1或T2或T3(即T1,T2或T3中的任何一个)正在等待获取锁,它的其他线程T4,T5,T6 ....
T10都将无法获取。锁,即T1,T2和T3,应优先获得相对于其他线程的锁。

我想可以通过增加线程T1,T2和T3的优先级来完成

即这是伪代码

if this thread is T1 or T2 or T3
increase its priority 
pthread_mutex_lock(&lock)
Some trivial code
pthread_mutex_unlock(&lock)
if this thread is T1 or T2 or T3 decrease it priority to normal

请注意,我想要一个适用于Linux平台且应使用pthreads的解决方案。 我真的不在乎其他平台。

还要注意,我并不是真的想使这3个线程成为实时线程,我希望它们表现出它们的默认行为(调度和优先级),除了在上面提到的一小段代码中,我希望它们在获取锁定时始终具有优先级。

我已经阅读了一些有关Linux中的调度策略和调度优先级的手册页,但实际上并不能弄清楚:(

这样行吗?您能为我提供完成上述任务所需的确切pthread API吗?

关于礼来


阅读 532

收藏
2020-06-07

共1个答案

小编典典

据我了解,真正保证这一点的唯一方法是编写一个自己可以运行的锁。但是,如果使用@
xryl669的答案
建议使用线程优先级和优先级继承,则肯定值得考虑。

要自己实现它,您将需要条件变量和等待的低/高优先级线程数的计数。

就所需的概念和API而言,它与实现读/写锁相对类似(但显然,所需的语义是完全不同的-但是,如果您了解了r /
w锁的工作原理,则可以将了解如何实现您想要的东西)。

您可以在此处看到读写锁的实现:

http://ptgmedia.pearsoncmg.com/images/0201633922/sourcecode/rwlock.c

在较低优先级的线程中,您需要等待高优先级的线程完成,就像读者等待编写器完成一样。

(以上代码的书摘自这本书,也是很棒的posix线程书,网址为http://www.informit.com/store/product.aspx?isbn=0201633922)

2020-06-07