[C] X aantal threads maken en behouden

Pagina: 1
Acties:
  • 172 views sinds 30-01-2008
  • Reageer

  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
Ik ben met een programma bezig op mijn server in C. Het gaat om een RedHat Linux 9 server.

Daarin wil ik een programma maken die een lijst doorloopt en alles in die lijst met een extern programma uitvoert. Dit gedeelte heb ik al maar ik wil niet dat die lijst commando voor commando uitgevoerd wordt maar ik wil dat er bijvoorbeeld 50 threads actief zijn om de lijst te doorlopen.
Dus als een van die 50 client threads is afgelopen er een nieuwe thread gestart wordt met het volgende lijst element.

Waarmee is dit mogelijk? ik heb al aan spawnl() gedacht alleen dan kan ik maar op 1 thread wachten ik weet niet hoe ik er bv. 50 moet doen en daarnaast krijg ik spawnl() niet werkend onder linux.

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

kijk eens naar pthread_*

Doet iets met Cloud (MS/IBM)


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

wat dacht je van fork () en exec ()

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
exec() geeft geen return status, dus weet ik niet of de client is afgelopen.
met fork() weet ik ook niet hoe ik dat 50x kan doen en dat aantal in evenwicht houden.

@D2K ik zal eens kijken naar pthread_*

  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
ik dacht hiermee aan de gang te kunnen (hello.c):
http://www.llnl.gov/compu...s/pthreads/#CreateExample

Nu krijg ik alleen een compile error:
cc hello.c -o hello
/tmp/ccgCrdsZ.o(.text+0x6d): In function `main':
: undefined reference to `pthread_create'
collect2: ld gaf exit-status 1 terug
make: *** [hello] Fout 1
komt volgens mij omdat er wat bij de compile commando moet, ik weet niet wat... iemand?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Zoek je niet naar een threadpool implementatie omdat je wil voorkomen dat je constant de overhead kwijt bent van het maken van een nieuwe thread? (1 nieuwe thread maken ~= 30ms op een 500Mhz bak, recyclen ~= 0ms)

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

met pthread werken zal wel iets beter zijn, maar daar heb ik geen ervaring mee

fork () creeert een nieuw proces dat identiek is als het huidige. exec () start een nieuw proces over het huidige heen. Er is dus logischerwijs geen returnwaarde: jouw proces stopt gewoon bij de aanroep van exec.

Daarom doe je spawn () zoals dat in DOS/windows werkt in linux altijd met een combinatie van fork () en exec (). Fork retourneert in het parentproces de PID van de client. In het clientproces retourneert ie 0. En in het parent-proces kun je dan weer waiten op het exitten van de client

zoiets zeg maar:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
int main ()
{
    pid_t p;
    p = fork ();

    if (p == -1) // fork () is mislukt
        return 0;

    if (p == 0) // dit is de client
        exec ("executable hier"); // de code gaat niet verder dan exec ()

    wait (p); // p is de client pid, wacht op het sluiten van de client
}


Even uit mijn hoofd, er kunnen wat foutjes in zitten :)
Op deze manier kun je dus 50 clients spawnen, die op hun beurt weer steeds andere processen gaan spawnen en wachten tot ze klaar zijn

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • IcE_364
  • Registratie: Februari 2002
  • Laatst online: 20-08 16:55
TormentoR schreef op 02 September 2003 @ 14:17:
ik dacht hiermee aan de gang te kunnen (hello.c):
http://www.llnl.gov/compu...s/pthreads/#CreateExample

Nu krijg ik alleen een compile error:
[...]


komt volgens mij omdat er wat bij de compile commando moet, ik weet niet wat... iemand?
Je moet nog -lpthread toevoegen

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

met pthread werken zal wel iets beter zijn, maar daar heb ik geen ervaring mee
Pthread = gewoon threads en werkt goed (ondanks bloedjelelijke API). Fork dupliceert het hele proces en is dus niet echt multithreading maar een lelijke vorm van multiprocessing. Spawn is tevens multiprocessing en vereist sourcefile scheiding (nieuwe executable).

Professionele website nodig?


  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
.oisyn schreef op 02 September 2003 @ 14:22:

[knip]

Op deze manier kun je dus 50 clients spawnen, die op hun beurt weer steeds andere processen gaan spawnen en wachten tot ze klaar zijn
Maar dan ben ik de controle over de lijst kwijt, die zich in main bevindt.


@ IcE: ik gebruik nu als compile commando "cc hello.c -lpthread -D_POSIX_PTHREAD_SEMANTICS -o hello" gevonden op google :P toch bedankt!

Nu ik ptread_* aan de gang hebt moet het wel gaan lukken... loop ik weer vast dan post ik het hier wel... ondertussen.. alvast bedankt!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

curry684 schreef op 02 September 2003 @ 14:27:
[...]

Pthread = gewoon threads en werkt goed (ondanks bloedjelelijke API). Fork dupliceert het hele proces en is dus niet echt multithreading maar een lelijke vorm van multiprocessing. Spawn is tevens multiprocessing en vereist sourcefile scheiding (nieuwe executable).
heb je daar geen kernel ondersteuning voor nodig trouwens? (en ja RH9 heeft dat wel, maar dat even terzijde ;))
TormentoR schreef op 02 September 2003 @ 14:29:
[...]


Maar dan ben ik de controle over de lijst kwijt, die zich in main bevindt.
shared memory :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

compilen met -lpthread :)

spuit elf :z -> [rml]IcE_364 in "[ C] X aantal threads maken en behouden"[/rml]

[ Voor 71% gewijzigd door curry684 op 02-09-2003 14:44 ]

Doet iets met Cloud (MS/IBM)


Verwijderd

[laat]
Maar dan heb je toch geen fatsoenlijke locking? :?.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

linux heeft toch wel locking mogelijkheden neem ik aan :? Zeker op shared memory lijkt me dat nuttig

Maar ik ben wat dat betreft meer een windowshippie, dus ik zou het niet weten :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Shared memory kun je via global event flags synchronizeren, op VMS in ieder geval, en ik geloof dat Linux/Unix wat dat betreft hetzelfde werkt. Je kunt tevens (smartass mode) een mutex aanmaken via pthreads in het shared memory zelf, dus sizeof(pthread_mutex) extra reserveren en initializeren.

Professionele website nodig?


Verwijderd

curry684 schreef op 03 September 2003 @ 11:24:
Je kunt tevens (smartass mode) een mutex aanmaken via pthreads in het shared memory zelf, dus sizeof(pthread_mutex) extra reserveren en initializeren.
Lijkt me niet zo handig, want waarom gebruik je dan in hemelsnaam nog processes in plaats van threads? :).

Global event flags ken ik niet, zal ik eens nazoeken. :).

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als je threads gebruikt zul je je mem iig alsnog moeten synchronizen :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Lijkt me niet zo handig, want waarom gebruik je dan in hemelsnaam nog processes in plaats van threads?
Er is voor zover ik kan zien geen enkele reden om dit in meer processen te doen, echter zoals oisyn al zegt: of je nu multiprocessed of multithread, synchronizeren moet je toch.

Professionele website nodig?

Pagina: 1