Я пытаюсь установить приоритеты для pthreads, используя SCHED_RR, чтобы задача с более низким приоритетом не получала ЦП, когда задача с более высоким приоритетом готова к запуску. Моя система представляет собой конфигурации Ubuntu 18.04.1 LTS (без специальных опций ядра).
В тестовом примере обе задачи делятся в реальном времени, а задача с высоким приоритетом готова к запуску.
В тестовом примере создается два потока, каждый из которых кратковременно спит, а затем продолжает. Поток с низким приоритетом пытается создать вывод текста каждую секунду. Я ожидаю, что поток с низким приоритетом не должен выводить, а поток с более высоким приоритетом готов к работе в течение нескольких секунд. Вывод показывает, что в режиме реального времени делятся.
Это происходит, даже если я запускаю код от имени пользователя root (т.е. sudo ./ThreadTest)
#include <iostream>
#include <error.h>
#include <pthread.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
using namespace std;
// Thread function designed to use all realtime it can get intended to be started
// at high priority. Prints once per second if it can.
void * BackGroundThread(void *)
{
struct timespec now;
cout << "Low priority task start" << endl;
sleep(1);
clock_gettime(CLOCK_MONOTONIC, &now);
int32_t intStartSec = now.tv_sec;
for (int i = 0; i < 10; i++)
{
do
{
clock_gettime(CLOCK_MONOTONIC, &now);
} while (intStartSec == now.tv_sec); // Wait for second boundary.
cout << "Low priority task i( " << i << " ) " << " Time( " << now.tv_sec
<< ", " << now.tv_nsec << " )" << endl;
intStartSec = now.tv_sec;
}
cout << "Low priority task end." << endl;
return NULL;
}
// Thread function designed to use all realtime it can get intended to be started
// at high priority. Prints once per second.
void * HighPriorityThread(void *)
{
sleep(3);
cout << "High priority task start." << endl;
volatile int y = 0;
do
{
y++;
} while (y != 0); // Wait for second boundary.
cout << "High priority task end." << endl;
return NULL;
}
pthread_t * CreateRRThreadWithPriority(pthread_t *myThread, int priority,
void *(*start_routine)(void *))
{
int retVal = -1;
pthread_attr_t workingAttrib;
struct sched_param prioParam;
prioParam.sched_priority = priority;
retVal = pthread_attr_init(&workingAttrib);
if (retVal)
{
cout << "CreateRRThreadWithPriority: Failure from pthread_attr_init: "<< strerror(retVal) << endl;
}
retVal = pthread_attr_setschedpolicy(&workingAttrib, SCHED_RR);
if (retVal)
{
cout
<< "CreateRRThreadWithPriority: Failure from thread_attr_setschedpolic: "<< strerror(retVal) << endl;
}
retVal = pthread_attr_setschedparam(&workingAttrib, &prioParam);
if (retVal)
{
cout
<< "CreateRRThreadWithPriority: Failure from pthread_attr_setschedparam: "<< strerror(retVal) << endl;
}
retVal = pthread_create(myThread, &workingAttrib, start_routine, NULL);
if (retVal)
{
cout << "CreateRRThreadWithPriority: Failure from pthread_create: "<< strerror(retVal) << endl;
}
return myThread;
}
int main()
{
cout << "Thread Test" << endl; // prints Thread Test
cout << sched_get_priority_min(SCHED_RR) << endl;
cout << sched_get_priority_max(SCHED_RR) << endl;
pthread_t LP, HP;
CreateRRThreadWithPriority(&LP, sched_get_priority_min(SCHED_RR),
BackGroundThread);
CreateRRThreadWithPriority(&HP, sched_get_priority_max(SCHED_RR),
HighPriorityThread);
pthread_join(LP, NULL);
pthread_join(HP, NULL);
cout << "Complete" << endl;
return 0;
}
Выход:
Thread Test 1 99 Low priority task start Low priority task i( 0 ) Time( 11093, 13 ) Low priority task i( 1 ) Time( 11094, 17 ) High priority task start. Low priority task i( 2 ) Time( 11095, 3 ) Low priority task i( 3 ) Time( 11096, 4 ) Low priority task i( 4 ) Time( 11097, 16 ) Low priority task i( 5 ) Time( 11098, 8 ) Low priority task i( 6 ) Time( 11099, 14 ) Low priority task i( 7 ) Time( 11100, 1 ) Low priority task i( 8 ) Time( 11101, 5 ) High priority task end. Low priority task i( 9 ) Time( 11102, 2 ) Low priority task end. Complete
Дополнительная информация:
Думая, что задача с низким приоритетом была в состоянии выполнить из-за наличия нескольких ядер, я увеличил количество задач с высоким приоритетом до 12. Задача с низким приоритетом продолжалась, пока выполнялись 12 задач с высоким приоритетом. Чего мне не хватает? Есть ли настройка ядра?
Задача ещё не решена.
Других решений пока нет …