Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Threads zählen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
09.04.2005, 13:06 Uhr
9ball




Zitat von Spacelord:

Um mit NtQuerySystemInformation zu arbeiten musst du erstmal nen paar Strukturen deklarieren(wegen des nicht vorhandenen Headers) dann musst du nen Funktionspointer anlegen und mit GetProcAdress die Adresse aus ntdll.dll besorgen.


nene, die structs und enums stehen da: http://void.ru/files/Ntexapi.h
(SYSTEM_PROCESS_INFORMATION)
als import-library nimmste 'ntdll.lib' aus dem nt/xp/2k-ddk (gehen alle)
zusätzliche infos gibts da: www.amazon.de/exec/obidos/ASIN/1578701996/028-7611769-8616518
alles ganz easy


Zitat von Spacelord:

Und wenn du die Anzahl der Threads so ermittelst musst du den ganzen Kram doch trotzdem noch synchronisieren!?


nein, du musst nichts synchronisieren. NTQS kann man zu jedem zeitpunkt aufrufen
--
one for all and all for one

Dieser Post wurde am 09.04.2005 um 13:12 Uhr von 9ball editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
09.04.2005, 16:41 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von 9ball:

[quote Spacelord]
Und wenn du die Anzahl der Threads so ermittelst musst du den ganzen Kram doch trotzdem noch synchronisieren!?


nein, du musst nichts synchronisieren. NTQS kann man zu jedem zeitpunkt aufrufen[/quote]

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?
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.
Ich kann nicht so ganz nach vollziehen warum du meinst dass man mit NtQSI nichts synchronisieren müsste??

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.
Was spricht denn dagegen die dafür vorgesehene Semaphore zu nutzen?
Vielleicht solltest du mal nen Beispiel posten damit ich nach vollziehen kann was da so einfach dran sein soll.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 09.04.2005 um 16:41 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
10.04.2005, 19:44 Uhr
Spacelord
Hoffnungsloser Fall


Also um die Anzahl der Threads grob zu begrenzen kann man das so machen.Aber wenn es wirklich um die Wurst ginge würde ich mich darauf nicht verlassen .

Also ich werde mich auch in Zukunft auf Kernelobjekte zur Synchronisation verlassen .

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
12.04.2005, 13:38 Uhr
SKARF



Hab ich was nicht mitgekriegt?

Sollte das ganze nicht auch mit einer normalen Globalen Variable gehen?
( vermutlich nur solange es nur einen Prozessor gibt ?? )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
12.04.2005, 16:57 Uhr
Spacelord
Hoffnungsloser Fall


Ja die Möglichkeit wurde weiter vorne mal erwähnt.Das geht auch .
Aber die Variable muss volatile sein.Damit wird der Compiler angewiesen keine Annahmen über den aktuellen Wert der Variable zu treffen sondern stattdessen immer den aktuellen Wert aus der Speicheradresse zu laden(und auch wieder zurück zu schreiben).
Ausserdem wäre es in diesem Fall sinnvoll die beiden Funktionen InterlockedIncrement und InterlockedDecrement zu nutzen.Die muss man nicht selber synchronisieren .

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: