012
10.04.2005, 01:14 Uhr
9ball
|
Zitat von Spacelord: |
Was sollte denn den Scheduler daran hindern nem anderen Thread Rechenzeit zuzuteilen nachdem du mit NtQuerySystemInformation geprüft hast ob weniger als n Threads laufen?
|
nichts
Zitat von Spacelord: |
Folgendes Szenario: Du holst dir mit ntqsi die Anzahl der laufenden Threads. Sagen wir mal das sind 49 und 50 sollen es maximal sein.Also gibt der mainthread bei 49 noch seine "Freigabe" einen Thread zu erstellen. Gerade da wo der neue Thread initialisiert wird(bevor das Kernelobjekt vom Betriebssystem geführt wird) gibt der Scheduler die Rechenzeit an andere Threads ab un letztendlich wieder an den Hauptthread. Dieser prüft erneut ob er nen weiteren Thread starten kann und holt sich mit ntqsi die Anzahl der Threads.Das sind aber immer noch 49 weil der zuletzt neu erstellte ja noch nicht fertig war und noch(!!) nicht als Kernelobjekt geführt wird. Also wird die "Freigabe" für noch nen Thread gegeben. Und schon hast du 51 Threads am laufen.
|
nein, weil in deinem prozess normalerweise keine threads von extern gestartet werden. threads von anderen prozessen interessieren ja nicht.
Zitat von Spacelord: |
Ich kann nicht so ganz nach vollziehen warum du meinst dass man mit NtQSI nichts synchronisieren müsste??
|
man braucht keine zugriffe auf variablen etc. zu synchronisieren. NTQS liefert einen snapshot der aktuellen situation.
Zitat von Spacelord: |
Und nicht jeder der kontrolliert nen paar Threads laufen lassen will möchte sich nen ddk installieren zumal das XP DDK mittlerweile nicht mehr umsonst ist.
|
man braucht kein komplettes ddk, nur die 'ntdll.lib' (es geht aber auch ohne, wie du weisst). alte ddk's (für win2k z.b. findet man immer noch zum download irgendwo im internet)
Zitat von Spacelord: |
Vielleicht solltest du mal nen Beispiel posten damit ich nach vollziehen kann was da so einfach dran sein soll.
|
hier mal ein schneller hack, damit du das nachvollziehen kannst (compiled mit dev-cpp als c-projekt, keine ntdll.lib nötig)
Code: |
#include <stdio.h> #include <windows.h>
DWORD __stdcall ThreadProc (void *p) { printf ("new TID %d sleeping %d\n", GetCurrentThreadId(), p); Sleep ((int)p); printf ("TID %d goes away\n", GetCurrentThreadId()); return 0; }
typedef DWORD(__stdcall *NTQS)(DWORD, DWORD*, DWORD, DWORD*);
DWORD ThreadCount (void) { static NTQS ntqs; static DWORD buf[0x8000]; DWORD *p = buf; if (!ntqs) ntqs = (NTQS)GetProcAddress (GetModuleHandle("ntdll.dll"), "NtQuerySystemInformation"); ntqs (5, buf, sizeof(buf), 0); while (p[17] != GetCurrentProcessId()) p += p[0]/sizeof(DWORD); return p[1]; }
int main() { DWORD tid; DWORD threads;
srand (GetTickCount()); while (1) { while (1) { threads = ThreadCount(); printf ("running threads: %d\n", threads); if (threads > 50) break; CreateThread (NULL, 0, ThreadProc, (void*)(rand()%100*1000), 0, &tid); Sleep (100); } Sleep (200); } return 0; }
|
-- one for all and all for one |