Gehe zu deutscher Webseite

ViaThinkSoft CodeLib

This article is in:
CodeLibProgramming aidsC / C++

Möchte man in C++ eine Funktion parallel, erstellt man einen neuen Thread. Möchte man jetzt aber die Funktion wirklich nur als Detached-Prozedur verwenden, auf die keine Kontrolle mehr erhoben werden soll, so kann folgender Code verwendet werden:

//********************************************************************************************
//
// async_function_call
//
// Startet eine funktion, ohne auf diese zu warten.

void async_function_call( void* (*start_routine)(void*), void* arg ) {
        pthread_t mythread;
        pthread_attr_t tattr;

        pthread_attr_init(&tattr);
        pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);

        pthread_create( &mythread, &tattr, start_routine, arg );

        pthread_attr_destroy(&tattr);
}

Achtung! Der Thread erhält kein "Join"! Das heißt, es ist möglich, dass der Hautprogrammteil fertig ist und das Programm beendet, ohne dass alle Thread-Funktionen zuende gelaufen sind!

Ggf. sollte bei jeder Funktion auf Fehler überprüft werden (Rückgabewert ist dann ungleich 0).

Die Verwendung ohne Parameter sieht wie folgt aus:

void* meine_funktion(void*) {
        std::cout << "Hallo World!" << ::std::endl;
        return 0;
}

int main(void) {
        async_function_call(meine_funktion, NULL);

        return 0;
}

Soll z.B. ein int-Wert an die Funktion übergeben werden, sieht es folgendermaßen aus:

void* meine_funktion(void* data) {
        int arg = (int)data;

        std::cout << "Hallo World!" << ::std::endl;
        std::cout << arg << ::std::endl;

        return 0;
}

int main(void) {
        int arg = 7;

        async_function_call(meine_funktion, (void*)arg);

        return 0;
}

Ein C-String kann wie folgt übergeben werden:

void* meine_funktion(void* data) {
        char *arg = (char*)data;

        std::cout << "Hallo World!" << ::std::endl;
        std::cout << arg << ::std::endl;

        return 0;
}

int main(void) {
        char *arg = "Ich bin ein Mitbringsel!";

        async_function_call(meine_funktion, (void*)arg);

        return 0;
}

Sollen mehrere Werte übergeben werden, so kann auf ein Struct-Element zurückgegriffen werden. Das sähe dann so aus:

struct koordinate {
        int x;
        int y;
};

void* meine_funktion(void* data) {
        struct koordinate* k = (struct koordinate*)data;

        int x = k->x;
        int y = k->y;

        std::cout << "Hallo World!" << ::std::endl;
        std::cout << x << ::std::endl;
        std::cout << y << ::std::endl;

        free(k);

        return 0;
}

int main(void) {
        #ifndef __cplusplus
        struct koordinate *k = malloc(sizeof *k);
        #else
        struct koordinate *k = (struct koordinate*) malloc(sizeof *k);
        #endif

        k->x = 3;
        k->y = 7;

        async_function_call(meine_funktion, k);

        return 0;
}
Daniel Marschall
ViaThinkSoft Co-Founder