PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (c++) pthread_create



Akleson
28-10-2005, 18:28
Hallo

Prizipiell weiss ich wie man mit Threads umgeht, aber ich würde gerne wissen, ob es nicht eleganter geht. Ich beschreibe einfach mein Problem mit zwei Beispiel Codestücken.
So läuft es
void * threadFunk(void * argp)
{
((A*) argp)->funk();
}

class A {
public:
pthread_t t;

void funk() {
...
}

void classFunk() {
pthread_create(&t, NULL, threadFunk, this);
}
};
Ich finde die global definierte Funktion aber nicht wirklich schön. Ich hätte lieber so was wie
class A {
public:
pthred_t t;

void * funk(void * argp) {
...
}

void classFunk() {
pthread_create(&t, NULL, funk, NULL);
}
};
Leider meckert bei mir der Compiler, dass im das dritte Argument nicht schmeckt. Kennt jemand einen Workaround oder eine andere Lösung?

Gruss

oracle2025
28-10-2005, 19:06
Du must vermutlich immer eine Funktion ausserhalb der Klasse angeben, da eine Funktion innerhalb einer Klasse intern noch einen Zusätzlichen Parameter bekommt, nämlich den "this" Pointer:



void * funk( A * this, void * argp);


Die Lösung die du da hast, ist IMHO immer noch die Beste.

anda_skoa
28-10-2005, 19:46
Ich hab hier (ich glaube im Forum tutorials&tricks) einen Beitrag zum Thema C Callbacks gepostet.

Kurzfassung:
static Methode, darin das Kontext Argument casten und Zielmethode aufrufen.

Edit: http://www.mrunix.de/forums/showthread.php?t=38966

Ciao,
_

panzi
28-10-2005, 19:52
Entweder verwende boost threads oder mach's so:


class Thread {
public:
Thread() {}
virtual ~Thread() {}

virtual void run() = 0;

void start() {
pthread_create(&trd, NULL, starter, this);
}

void kill(int sig) {
pthread_kill( trd, sig );
}

void * join() {
void * reply = NULL;

pthread_join( trd, &reply );

return reply;
}

// ...

protected:
pthread_t trd;

static void * starter(void * ptr) {
Thread * ptrd = (Thread*)ptr;

ptrd->run();
pthread_exit(NULL);

return NULL;
}
};(Wobei hier garkein Errorhandling drinn is.)

Und dann leit' dir ne Klasse ab, wobei du run() überlädst.

locus vivendi
29-10-2005, 10:40
[...]Leider meckert bei mir der Compiler, dass im das dritte Argument nicht schmeckt. Kennt jemand einen Workaround oder eine andere Lösung?
Das ist eine FAQ:
http://www.parashift.com/c++-faq-lite/pointers-to-members.html

Akleson
29-10-2005, 14:55
Danke Jungs

Ich hab mich an den Vorschlag von anda_skoa gehalten und jetzt funktioniert es. In Zukunft werde ich sowas bestimmt noch schöner gestalten, aber so ist das halt, wenn man im Nachhinein solche Dinge noch einbauen muss. :rolleyes: Ich bin sicher ihr kennt das Problem.

Gruss