Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Parallelität

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 <
000
19.09.2003, 17:55 Uhr
~xodi
Gast


Hallo Leute!

Ich habe mal eine Frage bezüglich forks.
Stellt Euch vor, Ihr habt ein Tool, dass in einem Config-File verschiedene Schritte stehen, die dann nacheinander durchgeführt werden. Sequentiell ist die Koordination nun ja kein Problem, ich lass einfach alles nacheinander runterrappeln.
Aber bei den Forks wirds etwas komplizierter.
Jeder Sohn soll nun "eine Zeile" der Configdatei bearbeiten (~ca. 30 min Bearbeitungszeit).

Wie würdet ihr nun koordinieren, welcher Sohn welche Zeile macht?

Ich habe zwei Ideen, weiss allerdings nicht welche eleganter/besser/weniger aufwendig ist.

Zum einen kann ich ein eigenständiges Programm schreiben, dessen Sohnprozesse dann execl's ausführen und sich somit selber überlagern.
Das ist nicht sehr aufwändig (denke ich zumindest).

Andere Idee wäre einen shared memory-Bereich zu nutzen und dort das Configfile abzulegen mit einem int mehr pro Zeile, wo dann jeder Sohnprozess seine PID einträgt.
Es wäre dann für den Vater supereinfach zu kontrollieren, welche PID welche Zeile macht. Allerdings muss ich dann die Sohnprozesse wiederum untereinander mit Semaphoren koordinieren, welcher Sohnprozess sich welche Zeile nimmt.

Was denkt ihr?

Viele Grüße
xodi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.09.2003, 18:12 Uhr
virtual
Sexiest Bit alive
(Operator)


Im Hauptrozess die Configdatei zerlegen und dann pro Configurationseintrag einen eigenen Thread starten. Der Thread kann ja auch auf die Daten des mainthreads zugreifen.
Ich lese ein wenig Linux /UNIX umgebung aus Deinem post =>
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.09.2003, 18:15 Uhr
~xodi
Gast


Hm, das mit Threads is mir zu kompliziert. Da sagte unser Prof immer nur, dass es sehr unschöne Probleme geben kann. Muss ich ehrlich gesagt noch nicht haben, bin noch ziemlicher Programmier-Rookie
Vielleicht wäre es aber was für die Diplomarbeit.

greetz
xodi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.09.2003, 18:29 Uhr
virtual
Sexiest Bit alive
(Operator)


Shared memory ist deutlich komplizierter als Threads; in beiden Fällen mußt Du drauf achten, daß sich die Prozesse/Threads nicht gegenseitig den Speicher zermatschen.
Wenn Du es supereinfach haben willst, geh die execl Lösung ist Einfach, dafür nicht so ganz elegant.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.09.2003, 18:36 Uhr
~xodi
Gast


Ok, ich schau mir das mit den Threads nochmal im C-Tutorial an. Irgendwo ist der Ehrgeiz ja schon da was Elegantes zu basteln

Ich befürchte nur, dass ich dann mein ganzes Programm nochmal durchgucken muss. Habe ab und an in den Man-Pages gelesen, dass die ein oder andere Funktion wie z.B. strtok nicht thread-safe sind.
Deswegen war ich ursprünglich so auf die Forks aus. Aber mal sehen.
Auf jeden Fall schon mal Danke für den Tip!

Gruß
Xodi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.09.2003, 18:42 Uhr
virtual
Sexiest Bit alive
(Operator)


strtok durch strtok_r ersetzen bei thread. Ausserdem beim Compileren das Define _REENTRANT setzen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.09.2003, 15:34 Uhr
~xodi
Gast


also, ich habs nun doch (einigermaßen) elegant mit den forks hinbekommen. Waren im Grunde nur 30 Zeilen Code. Ich hab mir dabei zunutze gemacht, dass der sohnprozeß alle Daten des Vaters per copy-on-write erhält.
anbei der Code, falls jemand sowas mal braucht.

Keep it simple :


C++:
...

while(<noch Bedarf zu forken>)
{
              variable = <irgend ein wert>;
     switch(kind=fork())
    {
     case -1 :  (void)fprintf(stdout, "Error forking the process!\n");
                exit(-1);

     case  0 :  (void)sleep(1);
                             // wir sind im Sohn und können hier nun auf "variable" zugreifen"
                exit(0);
    }
}

// Signalhandler für Abbruch...
(void) signal(SIGINT, catch);

for(i = 0;i < <anzahl prozesse>;i++)
{
     kind=wait(&status);
     if(WEXITSTATUS(status) !=0)
     {
         (void)fprintf(stdout, "Ein Kind mit Signal %d beendet\n",WEXITSTATUS(status));
     }
         (void)fprintf(stdout, "%s: 1 workprozess fertig / %d verbleibend\n",tmp = do_date(time((time_t *)NULL), (char) TRUE),(int)(tdcount - i -1));

}


}


...




Solange im Sohn diese Variable nicht geändert oder zurückgegeben werden muss ist diese Lösung vollkommen ausreichend.
Ansonsten muss man halt die shared memory-Geschichte in Kauf nehmen.

Dieser Post wurde am 22.09.2003 um 16:31 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


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: