我正在调查一个问题,即使绝对等待时间明显已经过去,
pthread_cond_timedwait()
似乎仍会阻塞。
我正在研究的程序将其所有线程设置为使用 SCHED_FIFO。仅当我将这一行
* - rtprio 99
添加到 /etc/security/limits.conf
时,问题才存在。
我尝试构建一个最小的可重现程序,但是
pthread_cond_timedwait()
在测试程序中按预期工作。
此外,当问题发生时,将 gdb 附加到程序将永远挂起。我在
printf()
周围添加了一对 pthread_cond_timedwait()
,第二个 printf()
的消息从未出现。
我对 Linux 相当陌生,有谁知道为什么
pthread_cond_timedwait()
会阻塞过去的等待时间?
pthread_cond_timedwait()
必须在返回之前重新获取互斥锁,因此可能有另一个线程正在持有互斥锁。
或者,使用实时调度类意味着同一优先级中的其他实时线程可能无法及时阻塞或让出,从而阻止您的线程运行。这就是使用实时调度的含义:您获得了可预测性,但代价是您必须承担调度的负担。