Ich brauche einen Pool von Threads mit unterschiedlichen Prioritäten zu verwalten, so schrieb ich die folgende Threads Startprozedur:pThreads mit Echtzeit-Priorität
static
int startup(thrd_t *thrd, thrd_sync_t *sync, int prio)
{
pthread_attr_t attr;
int err;
struct sched_param param = {
.sched_priority = prio
};
assert(pthread_attr_init(&attr) == 0);
assert(pthread_attr_setschedpolicy(&attr, SCHED_FIFO) == 0);
assert(pthread_attr_setschedparam(&attr, ¶m) == 0);
err = pthread_create(&thrd->handler, &attr, thread_routine, (void *)thrd);
pthread_attr_destroy(&attr);
return err;
}
Im Prinzip ist der unprivilegierten Benutzer soll nicht diesen Code auszuführen erlaubt sein: Der Aufruf pthread_create() sollte EPERM zurückliefern, da der Thread mit hoher Priorität ausgeführt wird.
Unerwartet funktioniert es für den normalen Benutzer, aber es respektiert die gegebene Priorität überhaupt nicht.
Ich habe versucht, den Code zu ändern, indem die pthread_attr_t
zu entfernen und durch die Einplanung Attribut Einstellung, wenn der Thread erstellt wurde:
static
int startup(thrd_t *thrd, thrd_sync_t *sync, int prio)
{
pthread_attr_t attr;
int err;
struct sched_param param = {
.sched_priority = prio
};
err = pthread_create(&thrd->handler, NULL /*&attr*/, thread_routine,
(void *)thrd);
if (err != 0) return err;
err = pthread_setschedparam(thrd->handler, SCHED_FIFO, ¶m);
if (err != 0) return err;
return err;
}
Dieser Ansatz durch die Art und Weise schwierig ist, viel mehr zu verwalten, da im Fall von Fehler Ich muss den neu erstellten Thread beenden. Zumindest scheint es in Bezug auf Berechtigungsanforderungen korrekt zu funktionieren (nur root kann dies ausführen), aber die Prioritäten werden nicht eingehalten.
Mache ich etwas falsch?
EDIT
Ich habe soeben das folgende Stück Code, die von jedem Thread ausgeführt wird:
static
void getinfo()
{
struct sched_param param;
int policy;
sched_getparam(0, ¶m);
DEBUG_FMT("Priority of this process: %d", param.sched_priority);
pthread_getschedparam(pthread_self(), &policy, ¶m);
DEBUG_FMT("Priority of the thread: %d, current policy is: %d and should be %d",
param.sched_priority, policy, SCHED_FIFO);
}
Bei der ersten Methode (nämlich pthread_attr_t
Ansatz) es stellt sich heraus, dass der pthread_attr_setschedpolicy ist absolut nicht effektiv, da die Priorität 0 ist und die Richtlinie nicht SCHED_FIFO ist.
Mit der zweiten Methode (nämlich pthread_setschedparam
Ansatz) druckt die Funktion die erwarteten Daten, aber die Ausführung verhält sich falsch.
Wie stellen Sie fest, dass die Anrufe nicht eingehalten werden? Ich bin auf etwas Ähnliches gestoßen, aber die API wurde einfach nicht implementiert und als solche fehlgeschlagen. – Ioan
@Ioan: Sehen Sie sich die aktualisierte Version der Frage an. – Dacav
OT: Legen Sie keinen Code innerhalb 'assert()'. Wenn dies mit deaktiviertem Assert kompiliert wird, wird der Code nicht ausgeführt. – bstpierre