Я хочу написать программу на C++ для Windows (но желательно с поддержкой кроссплатформенности), в которой у меня есть два потока, запланированных на основе упреждающее планирование с приоритетом, которое похоже на поведение прерывания (когда прерывание происходит, основной поток приостанавливается, где бы он ни находился, и только когда поток прерывания снова переходит в спящий режим, основной поток возобновляется с того места, где он был приостановлен).
Это темы:
- Тема T_main
- Поток T_interrupt.
T_main все время работает в цикле while. Предполагается, что T_interrupt выполняется раз в секунду и делает что-то очень быстро.
Код в T_main довольно большой (тысячи строк кода).
Это должно быть очень точное время.
Я хочу, чтобы, когда придет время для запуска потока T_interrupt, ему был присвоен приоритет, чтобы он работал без перерыва, пока не завершится, и только тогда поток T_main возобновится с того места, где он остановился.
Если вам интересно, что я пытаюсь сделать, то вот основное объяснение: По сути, я запускаю симуляцию своего встроенного проекта. Я издевался над всем своим оборудованием и хочу запустить свое приложение на симуляторе на ПК. Цель состоит в том, чтобы проверить логическую реализацию моего приложения. Принимаются во внимание различия компиляторов и другие несовершенства. Для меня критически важно иметь возможность имитировать прерывание на основе 1-секундного таймера, которое существует на моем MCU. Мне трудно имитировать такое поведение, поскольку планирование потоков кажется совместным, а не упреждающим.
Я пытался использовать приоритеты и устанавливать методы планирования, такие как Round Robin SCHED_RR
или FIFO SCHED_FIFO
, но во всех случаях реализация планирования по-прежнему является кооперативной, а не упреждающей.
Вот мой код:
#include <iostream>
#include <thread>
#include <pthread.h>
#include <string>
using namespace std;
void MainApplicationFunc(void)
{
// Infinite loop in which the app is running
while(1)
{
MainProgram();
}
}
void TickTimerInterruptFunc()
{
while(1)
{
TickTimer();
std::this_thread::sleep_for(1s);
}
}
void setScheduling(std::thread &th, int policy, int priority)
{
sched_param sch_params;
sch_params.sched_priority = priority;
if(pthread_setschedparam(th.native_handle(), policy, &sch_params))
{
std::cerr << "Failed to set Thread scheduling" << std::endl;
}
}
int main()
{
std::thread T_interrupt(TickTimerInterruptFunc);
setScheduling(T_interrupt, SCHED_FIFO, 1);
std::thread T_main(MainApplicationFunc);
setScheduling(T_main, SCHED_FIFO, 20);
T_main.join();
T_interrupt.join();
}
T_main
будет работать до тех пор, пока он не будет заблокирован вводом-выводом или блокировкой вручную, и не будет прерванT_interrupt
, потому что оба являютсяSCHED_FIFO
, аT_main
имеет более высокий приоритет, чемT_interrupt
. - person t.niese   schedule 08.02.2021