2011-10-05 1 views
0

J'ai un système en temps réel (logiciel) qui interroge certaines données de capteur, effectue un traitement et attend le jeu de données de capteur suivant. Les données du capteur sont lues dans un fil récepteur et placées dans une file d'attente, de sorte que le fil principal est en train de "dormir" (au moyen d'un mutex) jusqu'à ce que les nouvelles données soient arrivées.Modèle pour réaliser des threads d'arrière-plan de faible priorité?

Il existe d'autres tâches telles que la consignation ou certains calculs à long terme en arrière-plan. Ceux-ci sont implémentés pour s'exécuter dans d'autres threads. Cependant, il est important que le thread principal traite les données du capteur, mais qu'il doit avoir la priorité la plus élevée, ce qui signifie que les autres threads ne doivent pas du tout utiliser de ressources CPU (les threads d'arrière-plan provoquent actuellement le thread principal ralentir d'une manière inacceptable.)

Selon Setting thread priority in Linux with Boost, il existe un doute que la définition des priorités de thread fera le travail. Je me demande comment je peux mesurer l'effet de la définition des priorités de threads? (Plate-forme: Angstrom Linux, ARM PC)

Existe-t-il un moyen de "mettre en pause" et de "continuer" complètement les discussions?

Y at-il un motif en C++ pour réaliser la pause/continuer tout seul? (Je pourrais peut-être diviser le travail de fond en petits morceaux et je pourrais vérifier chaque morceau de travail si je suis autorisé à continuer, mais la question est de savoir quelle taille ces morceaux devraient être etc.)

Merci pour vos commentaires !

+0

Pourquoi ne pas simplement créer le fil du récepteur et le fil principal avec une très grande priorité? Lorsque le thread du capteur est prêt par le pilote, il fonctionne en utilisant tout un CPU et quand il définit le mutex, le thread principal tourne avec tout le CPU, (bien une fois que le thread du capteur revient à attendre sur son driver) . A défaut, pouvez-vous déplacer tout/partie du traitement des données du capteur vers le pilote du capteur? –

Répondre

4

Votre problème est avec le planificateur de système d'exploitation, pas le C++. Vous devez avoir un réel planificateur en temps réel qui bloquera les threads de priorité inférieure alors que le thread de plus haute priorité est en cours d'exécution.

La plupart des planificateurs PC "standard" ne sont pas en temps réel. Il y a un planificateur RT pour Linux - utilisez-le. Commencez par lire à propos de SCHED_RR et SCHED_FIFO, et la commande nice.

Dans de nombreux systèmes, vous devrez frayer un tâche (en utilisant fork) pour assurer les niveaux de Nice et le planificateur RT sont réellement efficaces, vous devez lire les manuels de votre système et savoir quel ordonnancement modules que vous avez et comment sont-ils mis en œuvre.

0

Il n'y a pas de manière portable de définir la priorité dans Boost :: Thread. La raison en est que différents systèmes d'exploitation auront différentes API pour définir la priorité (par exemple Windows et Linux). La meilleure façon de définir la priorité de manière portable consiste à écrire un wrapper sur boost :: thread avec une API uniforme qui obtient en interne le thread native_handle, puis utilise l'API spécifique au système d'exploitation (par exemple, dans Linux vous peut utiliser sched_setscheduler()). Vous pouvez voir un exemple ici: https://sourceforge.net/projects/threadutility/ (code composé par un de mes étudiants, regardez le dépôt svn)

+0

Je devrais probablement poster cette réponse dans la question liée ... – knulp

Questions connexes