Maximale Anzahl an Threads



  • Hallo,
    wie viele Threads kann man inerhalb einer MFCanwendung gleichzeitig starten?

    mfg kevin



  • MSDN schrieb:

    The number of threads a process can create is limited by the available virtual memory. By default, every thread has one megabyte of stack space. Therefore, you can create at most 2028 threads. If you reduce the default stack size, you can create more threads.



  • Erstellst du die Threads auf den Stack hast du ca. 80 Threads die du starten kannst bis 1 MB voll ist. Default hat jedes Programm 1MB auf dem Stack reserviert.
    Erstellst du Threads auf dem Heap dann kannst du bis zum ende Speicher erstellen.
    Kommt immer darauf an wieviel dein Thread Speicher braucht. Braucht er 800k dann kannst du auch keine 80 auf dem Stack erstellen.
    Die 80 kommen von einem Programm von mir welches eine von CWinThread abgeleitete Klasse hatte. In dieser habe ich mitt CSocket auf einen Server verbunden und Datenpackete gesendet. Das ganze ca. 80 mal.



  • Erstellst du die Threads auf den Stack

    Erstellst du Threads auf dem Hea

    hä?



  • ok vielen dank für die Antworten



  • Unix-Tom schrieb:

    Erstellst du die Threads auf den Stack hast du ca. 80 Threads die du starten kannst bis 1 MB voll ist. Default hat jedes Programm 1MB auf dem Stack reserviert.
    Erstellst du Threads auf dem Heap dann kannst du bis zum ende Speicher erstellen.
    Kommt immer darauf an wieviel dein Thread Speicher braucht. Braucht er 800k dann kannst du auch keine 80 auf dem Stack erstellen.
    Die 80 kommen von einem Programm von mir welches eine von CWinThread abgeleitete Klasse hatte. In dieser habe ich mitt CSocket auf einen Server verbunden und Datenpackete gesendet. Das ganze ca. 80 mal.

    😕
    Kannst du mir das mit dem 'auf em stack/heap' erstelln genauer erklären? Oder nen MSDN link posten, hab davor noch nie was gehöhrt (würde es aber gern wissen 🤡 )
    Das was ich bisher dazu gelesen hab ist eingelich nur die bschränkung beüglich virtual memory -> jeder thread braucht nen eigenen stack, irgendwann ist also der speicher fertig. Wüsste aber nicht dass man die irgendwie auf den heap auslagern kann !?!? 😮



  • CMatt schrieb:

    Das was ich bisher dazu gelesen hab ist eingelich nur die bschränkung beüglich virtual memory -> jeder thread braucht nen eigenen stack, irgendwann ist also der speicher fertig. Wüsste aber nicht dass man die irgendwie auf den heap auslagern kann !?!? 😮

    er meint wohl objekte von typ 'CWinThread' (dessen member variablen). die threads selber werden vom kernel erzeugt. die anwendung braucht dafür keinen speicher zu reservieren. jeder thread hat seinen eigenen stack. die thread-id's haben einen abstand von 4, so dass theoretisch (2^32)/4 threads in einem windoof-system laufen können



  • net schrieb:

    er meint wohl objekte von typ 'CWinThread' (dessen member variablen).

    ohh.... hab mich schon gefreut igrend nen neuen trick verraten zu bekommen 😃

    net schrieb:

    die anwendung braucht dafür keinen speicher zu reservieren. jeder thread hat seinen eigenen stack. die thread-id's haben einen abstand von 4, so dass theoretisch (2^32)/4 threads in einem windoof-system laufen können

    du vergisst da eine wichtige sache: wo liegt der stack? -> in dem speicher deines prozesses.
    Dein prozess hat 2GB virtual memory zu verfügung, was beteuet du kannst sehr viel weniger threads als 2^23 anlegen weil dir irgendwann der speicher für die thread-stacks ausgeht (2GB(virtual memory)/1MB(default stack size) = 2048 threads wenn dein prog von addresses 0 bis 2GB alles mit thread-stacks voll stopfen kann 🤡 )



  • CMatt schrieb:

    net schrieb:

    die anwendung braucht dafür keinen speicher zu reservieren. jeder thread hat seinen eigenen stack. die thread-id's haben einen abstand von 4, so dass theoretisch (2^32)/4 threads in einem windoof-system laufen können

    du vergisst da eine wichtige sache: wo liegt der stack? -> in dem speicher deines prozesses.

    hab' ich alles nicht berücksichtigt 😉 ich meinte ja auch im gesamtsystem kann es so viele threads (theoretisch!!) geben. machste halt die stacksize auf 4 bytes pro thread und jedesmal gleich CloseHandle nach CreateThread 🕶 irgendwie kann man den scheduler schon in die knie zwingen 😃



  • stacksize auf 4 bytes pro thread

    😃



  • Kann man die Rücksprungadressen auf dem Heap auslagern?



  • CNero schrieb:

    Kann man die Rücksprungadressen auf dem Heap auslagern?

    voll reingefallen 😉
    ein thread braucht keine rücksprungadresse



  • ich meine wenn man in dem thread Funktionen aufrufen möchte. die brauchen ne rücksprungadresse



  • CNero schrieb:

    ich meine wenn man in dem thread Funktionen aufrufen möchte. die brauchen ne rücksprungadresse

    die musste dann '__declspec(naked)' deklarieren. zurück geht's mit '__asm jmp' oder so 😃


Anmelden zum Antworten