[英]why PTHREAD_MUTEX_ADAPTIVE_NP behaves like PTHREAD_MUTEX_TIMED_NP when more than one pthreads compete for the mutex lock
程序创建一个PTHREAD_MUTEX_ADAPTIVE_NP互斥锁,现在线程A获得了锁。 当线程A给出锁时,三个线程(B,C,D)争夺该锁。 我想知道的是,为什么等待时间最长的线程总是总是先获得此锁,然后才获得第二长时间的线程...等等。
我认为PTHREAD_MUTEX_ADAPTIVE_NP就像pthread_spinlock一样,就像Kaz Sir在“ 什么是PTHREAD_MUTEX_ADAPTIVE_NP”中的回答:在公平很重要的情况下该方法也不适用:这是一种机会锁定。
像这样的代码
`Thread A:
main() {
mutex_lock;
pthread_create(B);
pthread_create(C);
pthread_create(D);
sleep(3);
mutex_unlock;
}`
Thread B() {
sleep(2);
mutex_lock;
printf("Thread B");
mutex_unlock;
}
Thread C() {
sleep(1);
mutex_lock;
printf("Thread C");
mutex_unlock;
}
Thread D() {
mutex_lock;
printf("Thread D");
mutex_unlock;
}
跟踪始终是第一个“线程D”->第二个“线程C”->最后一个“线程B”
睡眠会导致ADAPTIVE互斥体变为TIMED互斥体?
您的基本想法是正确的。 但是,自适应互斥锁仅在很短的时间内忙碌旋转(最多有100个PAUSE指令调用的循环)。 一旦进入内核睡眠阶段,它就会再次像常规互斥锁一样工作。
这是因为自适应互斥锁适用于非常短,竞争激烈的锁定部分,因此100圈旋转很有可能导致锁定可用。
因此,考虑到您的第二次长时间睡眠调用,您所有的锁都在内核中睡眠,而busyspin逻辑无关紧要。
您可以在此处为pthread_mutex_lock.c查找自适应互斥锁的实现。 万一忙碌的纺纱无法获得锁,nptl会退回到futex锁,我认为这至少是确定性的顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.