[Pthreads] 1 thread teveel?

Pagina: 1
Acties:

  • $n@p$hot
  • Registratie: Juni 2000
  • Nu online
Voor een project op school ben ik bezig een programma te schrijven dat een gecodeerde duitse tekst kan decoderen. Omdat dit nogal veel rekenkracht vergt mogen wij dit ons programma draaien op de Unite van het SARA in Amsterdam, maar de Unite is een multi-processor systeem (128 processoren) dus moeten wij ons programma multithreaded maken. Zo gezegd, zo gedaan, ik heb een hoofdprogramma gemaakt, wat 56 andere processen opstart en daarna wacht totdat alle opgestarte processen klaar zijn. Het stukje code wat ik gebruik om de threads op te starten:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
for (n=0; n<8; n++)
{
 for (j=0; j<8; j++)
 {
    if (j==n)
     continue;
    results[hulp].rotor1num = n;
    results[hulp].rotor2num = j;
    results[hulp].MaxIC = 0;
    pthread_create(&threadID[hulp],NULL,parallel,&results[hulp]);
    hulp++;
 }
}


Nu mijn probleem: Als ik mijn programma draai op een linuxbak en ik kijk daarna met ps hoeveel processen mijn programma heeft opgestart, dan zie ik er 58 ipv 57. Er zijn 2 processen ipv 1 die aan wachten zijn (status S in ps) en er zijn er 56 die aan het rekenen zijn (status S in ps). Helaas kan ik nu de output van ps niet posten omdat de linuxbak waarvan ik gebruik maak momenteel niet aanstaat. Weet iemand hoe dit kan?

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 29-08 22:51

D2k

hmmz das een goeie
je hebt niet een fork waardoor je main zich nog in 2en splitst voor die threads?

Doet iets met Cloud (MS/IBM)


  • $n@p$hot
  • Registratie: Juni 2000
  • Nu online
D2k schreef op 03 november 2002 @ 11:47:
......
je hebt niet een fork waardoor je main zich nog in 2en splitst voor die threads?
Nee niet dat ik weet, maar het kan natuurlijk zijn dat er een fork zit in de pthread library.

  • TheOneLLama
  • Registratie: Oktober 2000
  • Laatst online: 20-01-2022

TheOneLLama

A llama like no llama before

$n@p$hot schreef op 03 november 2002 @ 13:01:
Nee niet dat ik weet, maar het kan natuurlijk zijn dat er een fork zit in de pthread library.
Probeer anders eens 1 thread the creeren, kijk dan of je 3 processen ziet (nou ja het zijn dus geen processen eigenlijk, maar vooral threads).

<edit>
Het kan nl. zijn dat pthreads je process ook (dubbel dus) als thread weergeeft, wil niet zeggen dat er ook daadwerkelijk twee zijn.
</edit>

Opera OpenOffice.org Jabber Psi jabber://llama@mordax.com


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21:25
(jarig!)
Ah, grappig dat iemand dit uit zichzelf constateert. Dit is een typisch verschijnsel van Linux. Het is dat iemand 't me ooit verteld heeft, anders zou het me waarschijnlijk nooit opgevallen zijn.

Je moet bedenken dat in Linux threads gewoon light-weight processen zijn. Ze staan in de kernel in dezelfde tabel als 'echte' processen, alleen delen ze hun geheugen met andere 'processen'. In Linux moeten alle 'threads' (subprocessen) van een proces eenzelfde parent process hebben; geen idee waarom, maar zo werkt het nu eenmaal (misschien heeft 't iets te maken met scheduling of forken vanuit threads ofzo, ik zou 't echt niet weten).

Wanneer je een single-threaded applicatie hebt, is er niets aan de hand; je hebt gewoon een enkel proces. Wanneer je echter een nieuw thread maakt, dan krijgt deze de originele thread/process als parent process. Die originele thread, moet echter hetzelfde parent process hebben. Dit betekent dus, dat voor de originele thread ook een nieuw proces aangemaakt wordt! Op die manier heb je dus, wanneer je meerdere threads hebt, een enkele thread die helemaal niets doet, behalve dienst doen als parent process voor alle 'echte' threads, die het echt werk verrichten.

In je lijst van processen is dit ook goed te zien. Je hebt als het goed is een enkel proces dat de parent is van alle andere processen. Dit parent process doet helemaal niets, vandaar dat 'ie altijd wacht, zoals je al constateerde. (Je hebt dan twee wachtende processen, omdat het andere waarschijnlijk op invoer wacht.)

Er is dus niets mis met je code. Het werkt zoals de bedoeling is. Als je jou code onder een ander operating system zou compileren, krijg je dus wel het verwachte gedrag (en een thread minder).