Linux互斥优先级继承

时间:2016-06-01 11:16:35

标签: linux multithreading

我正在使用Linux互斥锁来保护多线程应用程序中的共享数据。 为防止优先级倒置,我使用PTHREAD_PRIO_INHERIT协议(http://linux.die.net/man/3/pthread_mutexattr_setprotocol)。
我的系统有三个线程:
线程1:低优先级,首先获取互斥锁
线程2:与线程1具有相同的优先级。无访问共享数据 线程3:高优先级。在线程1之后获取互斥锁

假设创建并首先运行线程1,然后它将锁定共享数据 线程3然后创建并运行,在milisencond之后,它获取线程1拥有的锁。所以线程3被阻止了 在PTHREAD_PRIO_INHERIT协议中,线程1的优先级将提升到线程3的优先级。
线程1释放锁定后,线程3将运行并完成 所以,我的问题是:接下来运行哪个线程,线程1还是线程2?

有人帮忙吗?

1 个答案:

答案 0 :(得分:0)

根据POSIX standard

  

如果在互斥锁引用的互斥锁对象上阻塞了线程   调用pthread_mutex_unlock()时,会产生互斥锁   变得可用,调度策略应确定哪个线程   应获得互斥锁。

该声明实际上是说实现可以随意唤醒它想要的任何线程。

但是,对于Linux,可以在此处找到调度程序策略:http://man7.org/linux/man-pages/man7/sched.7.html

请注意,Linux手册页根本没有提到互斥锁。

如果您的代码依赖于特定的唤醒顺序,则一个简单的互斥锁是要使用的错误同步对象。