Похоже, что да, планирование FIFO является детерминированным c. Я сделал два предположения, задавая этот вопрос, одно или оба из которых неверны:
- Архитектура x86_64 позволяет устанавливать точку останова выполнения, при которой одно ядро переходит на ISR, а все остальные ядра чтобы приостановить выполнение.
- GDB для x86_64 использует такую возможность для точек останова выполнения.
Я изменил функцию для потоков с низким приоритетом на:
void *tfunc(void *)
{
std::atomic<unsigned> i = 0;
while (!flag) {
;
}
while (run) {
++i;
}
if (i) {
std::cout << i << std::endl;
}
return nullptr;
}
И функция для высокоприоритетного потока:
void *t_mon_func(void *)
{
while (!flag) {
;
}
run = 0;
flag = 0;
return nullptr;
}
(пересмотренная программа в х. cc в https://github.com/ywkaras/MiscRepo/tree/master/TWATCH2.)
Наибольшее выходное значение для i
в любом потоке с низким приоритетом было 13.
Одна вещь, которую я до сих пор не понимаю, это то, что, если я увеличу количество потоков с низким приоритетом до гораздо более 10 , программа никогда не завершится.
(Я пытался удалить вопрос, но получил ответ, что лучше не удалять вопросы с ответами.)