Anzeige:
Ergebnis 1 bis 4 von 4

Thema: [C++] Funktion die beliebige Funktionen in einem Thread ausführt

  1. #1
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762

    [C++] Funktion die beliebige Funktionen in einem Kindprozess ausführt

    Ich möchte eine Funktion schreiben, die beliebig viele, beliebige Funktionen als Parameter bekommt und für jede dieser Funktionen einen fork() erstellt.

    Dabei gibt es zwei Probleme:
    a) die Parameterliste der Funktion
    b) ich bin noch nicht so zuversichtlich dass das läuft

    Bisher sieht es so aus:
    Code:
    template <class T>
    void parallel(T (*funktion)(...), ...) {
        va_list paramZeiger;
        va_start(paramZeiger, funktion);
        do {
            //einen Prozess erstellen, der die Funktion ausführen soll
            pid_t rueckgabe = fork();
            if(rueckgabe==0) {
                va_arg(paramZeiger, T);
            } else
                if(rueckgabe > 0) {
                    //Parent-Prozess macht (wenn alles gut geht) nichts
                } else {
                    //wenn das Erzeugen des Prozesses schief geht, dann selber die
                   // Funktion ausführen
                    va_arg(paramZeiger, T);
                }
        } while(paramZeiger!=NULL);
        va_end(paramZeiger);
    }
    An der Stelle "void parallel(T (*funktion)(...), ...)":
    Die erste Ellipse (fett markiert) kann so eigentlich nicht richtig sein. Es sollen zwar Funktionen mit beliebigen Parameterlisten übergeben werden können, aber eine Ellipse besteht aus einem festen Parameter und dann den drei Punkten.
    Wie schreibe ich das?

    Würde der Code so funktionieren? Ich hab grad keine Gelegenheit um das Praktisch zu testen.
    Geändert von SeeksTheMoon (01-08-2005 um 20:00 Uhr)
    I haven't lost my mind - It's somewhere on a backup-disc

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Du solltest vielleicht den Thread Titel ändern, dort steht was von Thread während im Posting Kindprozesse verwendet werden.

    Im Falle von Kindprozessen mußt du aufpassen, daß alle Werte im lokalen Scope der Funktion sind, also Parameter und lokale Variablen und keine Pointer oder Referenzen, weil die ja im Speicherbereich des Elternprozesses sind und für die Kinder unerreichbar wären.

    Im Falle von Threads würde ich da zu einer Lösung mit einem Interface tendieren.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    [QUOTE=anda_skoa]Du solltest vielleicht den Thread Titel ändern, dort steht was von Thread während im Posting Kindprozesse verwendet werden.[quote]
    ups, an den Unterschied habe ich gar nicht gedacht, ich habs geändert.

    Im Falle von Kindprozessen mußt du aufpassen, daß alle Werte im lokalen Scope der Funktion sind, also Parameter und lokale Variablen und keine Pointer oder Referenzen, weil die ja im Speicherbereich des Elternprozesses sind und für die Kinder unerreichbar wären.
    Ich habe mit dieser Funktion speziell folgendes vor: Auf http://sortieralgorithmen.de/mergesort/index.html gibts ein Listing für den Mergesort und andere Algorithmen in denen man Teile parallelisieren kann. Das soll diese Funktion erledigen; sie forkt und die Kindprozesse führen.
    Das sollte wertebereichsmäßig klappen, oder gehen nach der Bearbeitung die Werte verloren?

    Gibts noch andere Alternativen (z.B. clone())? Da betrete ich gerade Neuland und die ganzen Linux-SMP-Dokus sind wenig für Programmierer ausgelegt.
    Geändert von SeeksTheMoon (01-08-2005 um 20:15 Uhr)
    I haven't lost my mind - It's somewhere on a backup-disc

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Beim Sortieren mußt du dir halt überlegen, wie du die zu sortierenden Daten in die Kindprozesse bekommst, bzw deren Ergebnisse zurück in den Elternprozess.

    Threading wäre da einfacher, weil die Threads alle den Speicher des Prozesses benutzen können.

    Den clone() Systemcall brauchst du ansich nicht, normalerweise nimmt man die POSIX Thread API pthread oder eine darauf aufbauende Wrapperimplemenation, zum Beispiel boost http://www.boost.org/doc/html/threads.html oder ACE http://www.dre.vanderbilt.edu/Doxyge...E__Thread.html

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •