Frage

Ich lese Daten aus mehreren seriellen Ports. Derzeit verwende ich einen benutzerdefinierten Signalhandler (von sa_handler Einstellung) zu vergleichen und Wake-Threads basierend auf Dateideskriptor Informationen. Ich Suche nach einem Weg aus einzelnen Fäden mit einzigartigen Signal-Handler haben in diesem Zusammenhang fand ich, dass ausgewählter Systemaufruf verwendet werden soll.

Jetzt habe ich folgende Fragen:

  1. Wenn ich einen Thread bin mit (Qt) dann, wo ich den Auswahlsystemaufruf setze die serielle Schnittstelle zu überwachen?
  2. Ist der Auswahlsystemaufruf Thread-sicher?
  3. Ist es viel CPU-Kapazität, weil es viele Dinge passiert in meiner app einschließlich GUI-Update sind?

Bitte habe nichts dagegen, wenn Sie diese Fragen lächerlich finden. Ich habe noch nie einen solchen Mechanismus für die serielle Kommunikation verwendet wird.

War es hilfreich?

Lösung

Die POSIX-Spezifikation (wählen) der Ort zu suchen die select Definition. Ich persönlich poll empfehlen -. Es eine bessere Schnittstelle hat und eine beliebige Anzahl von Deskriptoren verarbeiten kann, anstatt eine systemdefinierte Grenze

Wenn ich das richtig verstanden, du bist Threads basierend auf dem Zustand bestimmter Deskriptoren zu wecken. Ein besserer Weg wäre jeder Thread zu haben, seinen eigenen Descriptor hat und ruft selbst wählen. Sie sehen, wählen Sie nicht den Systemstatus ändern, und so lange, wie Sie Thread-lokale Variablen verwenden, wird es sicher sein. Allerdings werden Sie auf jeden Fall sicherstellen möchten, dass Sie nicht schließen einen Beschreiber, die ein Thread abhängt.

Mit select / poll mit einem Timeout lässt die bis zum Kern Seite „warten“, was bedeutet, der Faden in der Regel schlafen gelegt wird. Während der Faden es schläft wird jede CPU-Zeit nicht verwendet wird. Ein while / for-Schleife auf einem select Anruf ohne Timeout auf der anderen Seite werden Ihnen eine höhere CPU-Auslastung geben, wie Sie in der Schleife konstant sind Spinnen.

Hope, das hilft.

EDIT: Auch select / poll kann zu unvorhersehbaren Ergebnissen führen, wenn sie mit dem gleichen Descriptor in mehreren Threads arbeiten. Der einfache Grund dafür ist, dass der erste Thread aufgeweckt werden könnte, weil der Deskriptor zum Lesen bereit ist, aber der zweite Thread hat für das neben warten „zum Lesen“ Wake-up.

Solange Sie auf dem gleichen Descriptor in mehreren Threads nicht sind selecting Sie kein Problem haben sollten.

Andere Tipps

Es ist ein Systemaufruf - es Thread-sicher sein sollte, denke ich,

.

Ich habe das nicht vor, aber ich wäre ziemlich überrascht, wenn es wo nicht. Wie viel CPU-Kapazität select() ist, hängt meiner Meinung nach stark von der Anzahl der Dateikennungen auf Sie warten. select() wird hauptsächlich verwendet, um eine Zahl zu warten (> 1) die Datei bereit zu werden, behandelt.

Es sollte auch erwähnt werden, dass select() sollte die Datei nicht behandelt abzufragen verwendet werden - für Performance Grund. Normale Nutzung ist: Sie haben Ihre Arbeit getan und einige Zeit vergehen kann, bis das nächste, was vor sich geht. Jetzt können Sie Ihren Prozess mit ausgewähltem suspendieren und einem anderen Prozess laufen lassen. select() macht normalerweise den aktiven Prozeß suspendieren. Wie das funktioniert zusammen mit Fäden, ich bin nicht sicher! Ich würde denken, dass der gesamte Prozess (und alle Threads) aufgehängt sind. Aber dies könnte zu dokumentieren. Es könnte auch abhängen (unter Linux), ob Sie system Gewinde oder Benutzer Threads verwenden. Der Kernel wird nicht wissen, Benutzer-Threads und damit den gesamten Prozess suspendieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top