Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Dietmar Ferstl Mini JLI'ler
Anmeldedatum: 19.07.2002 Beiträge: 47 Wohnort: Regensburg/Bayern Medaillen: Keine
|
Verfasst am: 14.06.2004, 20:44 Titel: |
|
|
Hallo,
einigen wir uns auf eine Subthread.
Nehmen wir mal an, dieser Thread wird mit: sleep(0) verlassen.
Wie will man denn wissen, wann es in diesem Thread wieder weitergeht?
D. |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 14.06.2004, 20:44 Titel: |
|
|
Windows hat ein Prioritätssystem, dass ganz klaare Regeln vorschreibt.
Es gibt Prioritäten, 5 Glaube ich und diverse Unterprioritäten.
Alle Threads und Prozesse befinden sich in einer Warteschleife, bis der Prozessor nach einer gewissen Zeit (200 Microsekunden glaub ich) den nächsten Kandidaten auswählt. Es werden immer wartende Prozesse mit der höchsten Priorität genommen, erst danach niedriger angesiedelte Prozesse und zum Schluss die idle-Prozesse.
Prozesse, die die höchste Prio. haben sind in der Regel nur Systemprozesse, die sich aber sofort schlafen legen, wenn sie nichts zu tun haben. Anwendungen laufen mit normaler Prio. und diverse Tools mit Idle-Prio. Jeder Thread eines Tasks kann zudem unterschiedlich priorisiert sein (nur mit Unterprioritäten)
Um jedes System Lahmzulegen, muss man nur ein Programm schreiben, dass so viele Threads anlegt, wie es Prozessoren im System gibt und jeder Thread in einer Endlosschleife [ for(;; ] mit der höchsten Priorität verweilt... _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Dietmar Ferstl Mini JLI'ler
Anmeldedatum: 19.07.2002 Beiträge: 47 Wohnort: Regensburg/Bayern Medaillen: Keine
|
Verfasst am: 14.06.2004, 20:49 Titel: |
|
|
Hallo,
es geht wesentlich schneller als nur 200 Microsekunden.
Das lässt sich sehr leicht testen, indem man einen Zähler inkrementiert,
und danach sleep(0) aufruft.
Aber das Timesharing ist unter Windows wohl nicht kontrollierbar, oder kennt sich da jemand besser aus?
Ich zumindest habe schon erlebt, dass ein Thread über eine sekunde nicht mehr bedient wurde, weil windows irgendwie im Speicher rumgekrasmt hat. Auslagern, Einlagern und all so'n unnützen Kram halt.
D. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 14.06.2004, 20:53 Titel: |
|
|
Dietmar Ferstl hat Folgendes geschrieben: | Hallo,
einigen wir uns auf eine Subthread.
Nehmen wir mal an, dieser Thread wird mit: sleep(0) verlassen.
Wie will man denn wissen, wann es in diesem Thread wieder weitergeht?
D. |
Wie kann man einen Thread mit sleep verlassen ? der wird automatisch verlassen sobald man den return befehl aufruft oder keine weiteren anweisungen folgen.
Ansonsten kann man feststellen ob ein thread beendet wurde indem man die übergebenen Variabeln verändert.
Manuell beenden kann man Threads ja auch mit CloseHandle
Man könnte allerdings auch versuchen herauszufinden ob ein sich beendeter Thread sein handla auf 0 setzt. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Dietmar Ferstl Mini JLI'ler
Anmeldedatum: 19.07.2002 Beiträge: 47 Wohnort: Regensburg/Bayern Medaillen: Keine
|
Verfasst am: 14.06.2004, 21:04 Titel: |
|
|
FallenAngel84 hat Folgendes geschrieben: |
Wie kann man einen Thread mit sleep verlassen ? der wird automatisch verlassen sobald man den return befehl aufruft oder keine weiteren anweisungen folgen.
|
Nehmen wir mal an wir haben einen Thread, indem nur max alle millisekunde etwas durchgezogen werden soll. Wir lesen also den performancecounter aus, und geben die CPU mittels sleep(0) wieder an andere Prozesse weiter, um performance zu gewinnen.
Das kann man sehr gut kontrollieren.
Aber wie kann man kontrollieren, dass die Zeit nicht z.B. über 2 Millisekunden läuft.
Zitat: |
Ansonsten kann man feststellen ob ein thread beendet wurde indem man die übergebenen Variabeln verändert.
|
klar, aber wir reden ja nicht vom finalen Ende eines Threads.
Zitat: |
Manuell beenden kann man Threads ja auch mit CloseHandle
|
oder endthread, wo dann der mega-stack etc. aufgeräumt wird.
D. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 15.06.2004, 12:38 Titel: |
|
|
Ich versteh die Frage immer noch nicht genau, dein Beispiel war nicht grade gut gewählt
Willst du das der Subthread nur alle 2 Millisekkunden anspringt oder was genau ? _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Dietmar Ferstl Mini JLI'ler
Anmeldedatum: 19.07.2002 Beiträge: 47 Wohnort: Regensburg/Bayern Medaillen: Keine
|
Verfasst am: 15.06.2004, 12:41 Titel: |
|
|
nein,
der subthread soll allerspätesten 2 Millisekunden nachdem dieser thread die CPU mit sleep(0) weitergereicht hat, wieder angesprungen werden.
Und das ist leider nicht bewerkstelligenbar. Zumindest nicht für einen Newbie wie mich.
Oder ?
D. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 15.06.2004, 12:44 Titel: |
|
|
Ich glaub nicht das dies möglich ist da ja das OS bzw. der Prozessor die Rechenzeiten einteilt. Man könnte allerhöchstens die ThreadPriorität steigern und hoffen das dies etwas bringt.
Aber was sind schon 2 Millisekunden _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Dietmar Ferstl Mini JLI'ler
Anmeldedatum: 19.07.2002 Beiträge: 47 Wohnort: Regensburg/Bayern Medaillen: Keine
|
Verfasst am: 15.06.2004, 13:05 Titel: |
|
|
FallenAngel84 hat Folgendes geschrieben: | Aber was sind schon 2 Millisekunden |
normalerweise wird zu 99,9 % der Thread binnen ca. 10 Microsekunden wieder angesprungen. Leider kann es aber auch mal bis zu einer Sekunde dauern und länger.
D. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 15.06.2004, 13:44 Titel: |
|
|
Wenn du auf sowas achtest musst du ja mit zeitkritischen Ablüfen arbeiten. Wenn das wirklich so ist und du eine kritische Zeitkontrolle hast sollte man da schon mit Zeitanpassungsformeln arbeiten (deltaTime und Co.) _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Dietmar Ferstl Mini JLI'ler
Anmeldedatum: 19.07.2002 Beiträge: 47 Wohnort: Regensburg/Bayern Medaillen: Keine
|
Verfasst am: 15.06.2004, 14:56 Titel: |
|
|
Hi,
das nützt einem leider nichts, falls eine Reaktion erst ausserhalb der Toleranzzeit stattfinden kann.
D. |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 16.06.2004, 08:24 Titel: |
|
|
In einer Einprozessor-Multiprozess-Umgebung kann dir NIEMAND garantieren, dass dein Thread nach einer von dir festgelegten Zeit 100%ig wieder drann ist. Erst wenn mehr Prozessoren als Threads zur verfügung stehen, kann man zimlich sicher sein, dass dein Thread ständig einen Rechenbereiten Prozessor findet bzw. besitzt. Dies ist heutzutage aber noch nicht der Fall...
Außerdem ist dann immernoch das Problem der begrenzten Ressourcen - zwei Prozesse können eben nicht zur gleichen Zeit die Festplatte nutzen, die arbeitet nun mal nur sequentiell (wenn auch schon mit ansehnlicher Geschwindigkeit, aber eben nicht so schnell wie ein Prozessor mir direken Ram-Zugriff) _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 07.08.2004, 00:22 Titel: |
|
|
AFE-GmdG hat Folgendes geschrieben: | Ein Programm, dass Singlethreaded Kompiliert wurde, belegt *immer* genau einen Task mit einem Thread.
Programme können auch Multithreaded kompiliert werden, dann wird gegen andere WindowsAPI-Funktionen gelinkt, nämlich gegen Funktionen, die Multithread-Sicher sind. Sie sind in der Regel etwas langsamer, da Sicherheitsmechanismen eingebaut sein müssen.
|
Was bedeutet denn Multithread-Sicher?
Ich hab ein Programm, welches im Hauptthread Direct3D Szenen rendert und im Hintergrund Ressourcen lädt.
Ich konnte das Programmm sowohl mit den Singlethreading Libraries kompilieren und ausführen, als auch mit den Multithreading Libraries.
Was bringen mir die Multithreading Libraries also für Vorteile?
P.s. Habe Direct3D mit D3DCREATE_MULTITHREADED initialisiert. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 07.08.2004, 23:15 Titel: |
|
|
Der Flag D3DCREATE_MULTITHREADED sorgt dafür das bestimmte interne DirectX Daten und Funktionen sicher gemacht werden, wodurch es unmöglich für andere threads ist darauf zuzugreifen, das sieht ungefähr so aus:
Code: | void SichereFoo()
{
MachSicher(...);
DoStuff();
MachUnsicher();
} |
so kann kein anderer thread daten verändern die in der Funktion Sicher gemacht wurden das verhindert das bestimmte daten benutzt werden obwohl die daten schon von einem anderen Thtread manipuliert wurden.
Edit: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/critical_section_objects.asp _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
KI JLI Master
Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 07.08.2004, 23:22 Titel: |
|
|
Danke für die Antwort.
Und was weißt du über die Laufzeitbibliothek, die man bin der Rubrik Codeerstellung in den Eigeschaften des Projektes einstellen kann?
Da kann man ja zwischen ML(Singlethreaded) und MT(Multithreaded) wählen. Da ich 2 Threads verwende, habe ich mich gewundert, dass man das Projekt auch mit der Parameter ML(Singlethreaded) kompilieren kann....
Ich wollte wissen, ob ich nicht besser MT benutzen sollte..?
Danke für den Link... vielleicht beantwortet der ja schon meine Frage. |
|
Nach oben |
|
|
|