Невозможно установить приоритет pthread в настольном приложении Ubuntu

Я пытаюсь установить приоритеты для 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 задач с высоким приоритетом. Чего мне не хватает? Есть ли настройка ядра?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]