gha*_*der 14 c linux multithreading pthreads
假设以下代码由10个线程执行.
pthread_mutex_lock(&lock)
Some trivial code
pthread_mutex_unlock(&lock)
Run Code Online (Sandbox Code Playgroud)
为了解释的目的,我们可以说线程是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
Run Code Online (Sandbox Code Playgroud)
请注意,我想要一个适用于Linux平台的解决方案,并且应该使用pthreads.我真的不关心任何其他平台.
还要注意我真的不想让这3个线程成为实时,我希望它们展示它们的defualt行为(调度和优先级),除了在上面提到的一小段代码中我希望它们始终具有获取锁定的优先权.
我已经阅读了一些关于在Linux中调度策略和调度优先级的手册,但实际上并不能解决:(
这会有用吗?你能帮助我完成上述任务所需的确切pthread API吗?
关心lali
caf*_*caf 11
这是我的实施.低优先级线程使用prio_lock_low()和prio_unlock_low()锁定和解锁,高优先级线程使用prio_lock_high()和prio_unlock_high().
设计非常简单.高优先级线程保持在临界区互斥->cs_mutex,低优先级线程保持在条件变量.条件变量互斥锁仅保留在共享变量的更新和条件变量的信令周围.
#include <pthread.h>
typedef struct prio_lock {
pthread_cond_t cond;
pthread_mutex_t cv_mutex; /* Condition variable mutex */
pthread_mutex_t cs_mutex; /* Critical section mutex */
unsigned long high_waiters;
} prio_lock_t;
#define PRIO_LOCK_INITIALIZER { PTHREAD_COND_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER }
void prio_lock_low(prio_lock_t *prio_lock)
{
pthread_mutex_lock(&prio_lock->cv_mutex);
while (prio_lock->high_waiters || pthread_mutex_trylock(&prio_lock->cs_mutex))
{
pthread_cond_wait(&prio_lock->cond, &prio_lock->cv_mutex);
}
pthread_mutex_unlock(&prio_lock->cv_mutex);
}
void prio_unlock_low(prio_lock_t *prio_lock)
{
pthread_mutex_unlock(&prio_lock->cs_mutex);
pthread_mutex_lock(&prio_lock->cv_mutex);
if (!prio_lock->high_waiters)
pthread_cond_signal(&prio_lock->cond);
pthread_mutex_unlock(&prio_lock->cv_mutex);
}
void prio_lock_high(prio_lock_t *prio_lock)
{
pthread_mutex_lock(&prio_lock->cv_mutex);
prio_lock->high_waiters++;
pthread_mutex_unlock(&prio_lock->cv_mutex);
pthread_mutex_lock(&prio_lock->cs_mutex);
}
void prio_unlock_high(prio_lock_t *prio_lock)
{
pthread_mutex_unlock(&prio_lock->cs_mutex);
pthread_mutex_lock(&prio_lock->cv_mutex);
prio_lock->high_waiters--;
if (!prio_lock->high_waiters)
pthread_cond_signal(&prio_lock->cond);
pthread_mutex_unlock(&prio_lock->cv_mutex);
}
Run Code Online (Sandbox Code Playgroud)
据我所知,唯一可以真正保证这一点的方法就是写一个像你自己一样的锁.但是@ xryl669的答案建议使用线程优先级和优先级继承当然值得考虑,如果它适用于您的用例.
要自己实现它,您将需要条件变量和等待低/高优先级线程数的计数.
就你需要的概念和API而言,它与实现读/写锁相当类似(但是你需要的语义完全不同,显然 - 但如果你理解了r/w锁是如何工作的,那么你'我将了解如何实现你想要的东西).
您可以在此处看到读写锁的实现:
http://ptgmedia.pearsoncmg.com/images/0201633922/sourcecode/rwlock.c
在优先级较低的线程中,您需要等待高优先级线程完成,就像读者等待编写器完成一样.
(上面的代码是从它上面得到的一本很棒的posix线程书btw,http://www.informit.com/store/product.aspx? isbn = 0201633922 )