2017-05-04 3 views
3

Ich arbeite mit einem Benutzermodus-Treiber für kleine USB-Geräte. Meine USB-Leseschleife sollte sehr reaktionsschnell sein und die Operationen, die sie ausführt, sollten sehr klein sein (nicht notwendigerweise atomar). Wie eine Interrupt-Service-Routine in einem Kernel-Modus-Treiber. In einer Verarbeitung muss ich einen Thread erstellen und einige Parameter an diesen Thread innerhalb dieser Leseschleife übergeben.Haben Sie einen bereits erstellten Thread zu jeder Zeit oder erstellen Sie den Thread bei Bedarf

Also muss ich die genaue obere Grenze dieser Operation wissen. Es dauert nicht mehr als 200mS oder so.

Die nächste Alternative besteht darin, die Thread-Initialisierung zur Einrichtungsinitialisierungszeit (Sondierungszeit) durchzuführen und dann diesen Thread zu warten, bis ich es aus dem Lese-Thread signalisiere. Aber in diesem Szenario läuft der Thread immer und es wäre teuer.

Was ist die beste Option? Meine Plattform ist Linux, und sie sagten, in Linux, Thread-Erstellung haben sehr kurze Operation. Ich muss entscheiden, was am besten ist. Bewahren Sie den Thread zu jeder Zeit am Leben oder erstellen Sie den Thread bei Bedarf.

+1

Haben Sie versucht, beide Optionen zu messen/zu gewinnen? –

+0

Ja, erstellen Sie den Thread zu jeder Zeit und warten auf Signal vom Thread lesen ist Speicherverschwendung, da Thread-Block Speicher ist. Andernfalls könnte der Lese-Thread eine hohe Latenz haben, wenn der Thread aus der Leseschleife erstellt wird. –

Antwort

2

Moderne Maschinen haben Hunderte, manchmal Tausende von Threads instanziiert und zu jeder Zeit im "Bereit" -Zustand. "Bereit" bedeutet nicht "Eigentlich läuft".

Es gibt also kein Problem damit, einen weiteren Thread bei der Geräteinitialisierung zu starten und ihn die meiste Zeit im "Bereit" -Zustand zu belassen und ihm einige Male in seltenen Fällen etwas zu tun.

Der Trick, um dies reibungslos funktioniert dies ist, um sicherzustellen, dass der Thread Block-Warten auf ein Ereignis auftritt. Wenn ein Thread block-wartet auf ein Signal ist es verbraucht Null oder fast Null CPU.

Das Starten eines neuen Threads bei jeder neuen Aktion kann sehr kostspielig sein. Ein neuer Thread muss normalerweise Speicher reservieren, und dies kann eine zeitaufwendige Operation sein, insbesondere in einem System, in dem der Arbeitsspeicher knapp wird und bei dem die Speicherzuweisung zu einem Austausch führen kann.

2

Erstelle einen Thread einmal und mach ihn so lange auf einem Semaphor oder Mutex, bis du es signalisierst. Auf diese Weise wird es nicht immer "laufen" und es wird nicht "teuer" sein. Auf diese Weise müssen Sie nicht wie folgt verfahren: "Was ist, wenn der Thread nicht gestartet wurde, als ich etwas Verarbeitung benötigte" oder "Was wäre, wenn das System beschäftigt und der Thread-Start langsam war?"

Nur eine kleine Sache : Wenn der Thread nicht viel bringt, würde ich ihn mit kleinerer Stackgröße initialisieren.

Verwandte Themen