我正在使用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?
有人帮忙吗?
答案 0 :(得分:0)
如果在互斥锁引用的互斥锁对象上阻塞了线程 调用
pthread_mutex_unlock()
时,会产生互斥锁 变得可用,调度策略应确定哪个线程 应获得互斥锁。
该声明实际上是说实现可以随意唤醒它想要的任何线程。
但是,对于Linux,可以在此处找到调度程序策略:http://man7.org/linux/man-pages/man7/sched.7.html
请注意,Linux手册页根本没有提到互斥锁。
如果您的代码依赖于特定的唤醒顺序,则一个简单的互斥锁是要使用的错误同步对象。