ThreadSwitch auf Prozessor unterdrücken
-
A thread affinity mask is a bit vector in which each bit represents a logical processor that a thread is allowed to run on.
SetThreadAffinityMask
-
er fragt hier nicht nach der Zuordnung der Threads, sondern wie man das Multithreading auf einem Kern deaktiviert!(?)
-
Was soll bitte der Sinn sein?
Wie man Windows lahm legt?Du kannst die Thread-Priority so hoch setzen, dass Dein Thread "immer" läuft, Du kannst aber einen Threadswitch nicht verhindern, denn irgendwann werden andee Threads auch als "wertvoll" für eine Zeitscheibe erachtet.
Warum auch? (s.o.)
-
Hi,
Mir ging es darum zu wissen wenn bei einer Multithreaded App ein Codefragment zeitkritisch ist, ob es mechanismen gibt, dieses fragment vor einer unterbrechung zu schützen. (Mir ist klar das es nur kurze fragmente sein sollten,.. )
Ich habe mich zwar ein bissl mit den Intel papers (x86) beschäftigt, unter anderem mit task switching, locks etc. ... aber die frage war ob es halt unter der winapi schon solch einen mechanismus gibt.
(Ich weiß, ich habe immer die unmöglichsten ideen
)greeetz
-
In der Windows API ist die Thread-Priority IMHO der einzige Weg, der Dich hier "etwas" schützen mag.
Aber welchen Sinn soll das haben? Wenn das FRagement sowieso nur kurz sein darf und soll wie Du sagst.
Wer profitiert dann von diesem "nicht unterbrechen"?
Dein Code läuft ja kurze Zeit später (entsprechend der Priority) weiter.Wer hat nun was davon?

Was auf Treiberebene möglich ist kann ich nicht sagen... aber das wird nicht Deine Intention sein einen Treiber zu schreiben.
-
@zeusosc:
Ich glaube da hast du das falsche Betriebssystem denn soweit wie ich weis benutzt Windows ein gewichtetes Round Robin Scheduling und daher kann dein Prozess im Worst Case von X anderen Prozessen unterbrochen werden.Aber wenn du wirklich eine harte Echtzeitanforderung (Deadline) hast, wäre ein Echtzeitbetriebssystem mit einer EDF (Earliest Deadline First) Scheduling Strategie die richtige Wahl.
-
Windows verwendet ein PREEMPTIVE PRIORITY BASED Scheduling. Ergänzend wird ein ROUND-ROBINSCHEDULING
eingesetzt, die Prioritäten haben allerdings Vorrang. RR wird nur eingesetzt, wenn
mehrere Threads dieselbe Priorität aufweisen!
-
@lowbyte_: Und dazu kommt noch die interne Anhebung der Threadpriority wenn ein Thread schon sehr lange übergangen wurde...

Das Threadscheduling von Windows hat es schon in sich. Ich halte von allen Versuchen an diesem Standardverhalten etwas zugunsten der eigenen Anwendung zu drehen für falsch, außer man bewegt sich eben in den gegebenen Wegen die entsprechenden Prioritäten anzupassen.
Mir kommt diese Frage genauso sinnlos vor wie: "Wie verhindere ich, dass meine Speichersteiten ausgelagert werden?"
-
Es gibt einen fiesen Trick, der zumindest auf einigen Windows Systemen ganz gut funktioniert: man ruft einfach SetThreadPriority auf, vorzugsweise mit eienr recht hohen Priorität, und zwar genau bevor man den die kritischen Dinge macht die nicht unterbrochen werden sollten.
SetThreadPriority setzt nämlich sozusagen die Zeitscheibe zurück, d.h. der Thread hat dadurch eine ganz neue frische Zeitscheibe.
Und wenn man das alle 2-3 ms wiederholt, bekommt man dadurch einen Thread der fast nicht unterbrochen werden kann/wird.
-
Dies ist so. Doch zuverlässig ist sowas nicht.
Ich frage mich was er wohl vorhat!?