【发布时间】:2020-08-08 10:26:47
【问题描述】:
我试图让这个线程在它所在的进程运行时始终在一个 CPU 核心(共 24 个)上运行:
void *t_mon_func(void *)
{
while (true) {
if (f) {
break_on();
}
}
return nullptr;
}
我将其配置为 SCHED_FIFO 调度和最大优先级。我有 50 个其他线程正在使用这个线程函数运行(默认优先级):
void *tfunc(void *)
{
std::atomic<unsigned> i = 0;
while (true) {
if (f) {
++i;
}
}
return nullptr;
}
在 gdb 中,我在 break_on 函数上设置断点,继续执行程序,然后触发该程序以将 f(全局变量)的值更改为非零值(通过来自较低优先级的线程)。当断点被击中时,许多低优先级线程中i的值在数千或数万之间。这似乎表明实时的高优先级线程并不总是在运行(在进程运行时)。还是我错过了什么?完整的程序在 x.cc 中:https://github.com/ywkaras/MiscRepo/tree/master/TWATCH。 (我以 root 身份运行程序。)
【问题讨论】:
-
高优先级 != 实时 != 始终运行
-
纯断言!=有用
-
我不认为您的测试测试您认为它测试的内容,因为它基于启动和停止事物,而不是在稳态条件下运行的事物。平台可能会以某种特定的顺序启动和停止某些事情,从而使某些事情在流程中的各个点运行而其他事情不运行。
-
@WaltK 我认为问题在于您自己的声明
"...the real-time, high-priorty thread is somehow not always running..."似乎等同于高优先级和实时的概念。操作系统内核交换线程的原因有很多。您似乎假设将 atomic intf设置为非零值将作为交换高优先级线程的信号——事实并非如此。 -
是的,我希望有人比“任何数量的原因”更具体地知道。在具有确定性调度的实时操作系统中,一个比任何其他线程具有更高优先级的可运行线程始终在运行,除非我认为所有内核上都运行着 ISR。我不明白为什么我的程序中的高优先级线程永远无法运行,它没有系统调用。
标签: c++ multithreading gdb pthreads rhel