Newsgroup: it.comp.lang.c++
Titolo: Qual'è la giusta interfaccia di una classe thread?

Ciao a tutti,
per fare una libreria soft-real time in C++ è stato necessario creare delle
classi che rappresentano delle entità di basso livello (come threads, mutex,
semafori...) da utilizzare nella libreria per garantire la portabilità verso
altri sistemi operativi (cambiando solamente l'implementazione di queste
classi).
Mi trovo però in un dubbio: dovendo scrivere una classe "thread" che  può
funzionare normalmente o con scheduling FIFO con diverse priorità, come
posso assegnare una priorità al thread indipendentemente
dall'implementazione fornita dal Sistema Operativo?
Mi spiego meglio. Attualmente la libreria funziona in Linux, cosicchè le
priorità di un thread possono andare da 0 a 99. Ma portando la libreria su
un altro sistema operativo le priorità potrebbero andare da -20 a +20 (è
solo un ipotesi). Insomma, qui c'è un grado di variabilità.
Non posso semplicemente creare una classe thread il cui costruttore accetta
un int che rappresenta la priorità, perchè la libreria che usa questa classe
non saprebbe in quale intervallo può andare quell'int. Si potrebbe ad
esempio far esportare alla classe thread due costanti MIN_PRIO e MAX_PRIO
che rappresentano la priorità massima e minima che può avere il thread.
Ma è una buona soluzione?
GRAZIE
Daniele.

 ha scritto nel messaggio
news:8s4rvr$2td$2...@nslave3.tin.it...

Potresti stabilire una scala di priorità all'interno della classe (ad
esempio da 0 a 100) e accettare nel costruttore un valore nel range di
quella scala, e poi all'interno della classe provvedere a convertirlo
secondo il sistema utilizzato, con una semplice proporzione.
Massimo

 secondo il sistema utilizzato, con una semplice proporzione.
GRAZIE per il tuo suggerimento, ma temo non si adatti alle mie necessità.
Infatti supponiamo di fare come tu dici. Scrivo un'applicazione che usa due
thread uno con priorità 50 e uno con priorità 51. Uso la classe thread
implementata per LINUX ed è tutto OK, perchè le priorità dei thread di LINUX
vanno da 0 a 99 quindi sono mappate 1:1.
Poi diciamo che voglio portare la mia applicazione su un sistema operativo
le cui priorità vanno da 0 a 29, allora scrivo una classe thread per questo
Sistema Operativo. Mappando le priorità 50 e 51 nella nuova classe thread,
finiranno nelle priorità "reali" 15 e ... 15 !!!!
Se ero partito con due thread che avevano uno una priorità maggiore
dell'altra, ora mi ritrovo con due thread con la stessa priorità, e il
comportamento sarà completamente diverso!
Nel mio caso questo non funziona perchè sto implementando uno scheduler,
che, cambiando le priorità dei thread a istanti prefissati, decide in quale
ordine far funzionare diversi task.
Per fare questo devo usare delle priorità adiacenti, ad esempio da 50 a 60
nel caso di LINUX. Non potrei permettermi che nel portare l'applicazione ad
un altro sistema operativo, due thread si ritrovino ad avere la stessa
priorità, altrimenti lo scheduler non funzionerebbe più!
GRAZIE
Daniele.

Potresti scrivere delle funzioni che ti restituiscono il valore di priorità
adeguato in base a quello che devi fare.
Tipo :
int GetPriorityLessThen (CThread *)
int GetPriorityGreatherTen (CThread *)
In pratica fai in modo che sia la tua libreria a stabilire quale sia il
livello di priorità corretto da dare ai tuoi thread.
Ovviamente occorre comunque una funzione o una costante per stabilire il
livello di priorità dal quale devi partire.