C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Threads mit C++
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Michael Gebhart
Guest





PostPosted: Sun Oct 10, 2004 10:06 am    Post subject: Threads mit C++ Reply with quote



Hi zusammen,

ich möchte Threads in einem C++ Programm nutzen. Also wirklich C++ und kein
C. Ich habe versucht mit pthreads zu arbeiten, was jedoch nicht
funktioniert. Ich muss bei pthreads einen Pointer auf eine Funktion setzen
und kann dafür keine Memberfunction nehmen.

Gibt es speziell für C++ Threads, so dass ich auch Memberfunctions nutzen
kann? Dass ich keinen Hybriden aus C und C++ bauen muss, wie bei pthreads?

Gruß

Mike

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Markus Breuer
Guest





PostPosted: Sun Oct 10, 2004 12:00 pm    Post subject: Re: Threads mit C++ Reply with quote



Michael Gebhart wrote:
Quote:
Hi zusammen,

ich möchte Threads in einem C++ Programm nutzen. Also wirklich C++ und kein
C. Ich habe versucht mit pthreads zu arbeiten, was jedoch nicht
funktioniert. Ich muss bei pthreads einen Pointer auf eine Funktion setzen
und kann dafür keine Memberfunction nehmen.

Gibt es speziell für C++ Threads, so dass ich auch Memberfunctions nutzen
kann? Dass ich keinen Hybriden aus C und C++ bauen muss, wie bei pthreads?

Die p(osix)-threads gibt es nur unter Linux/Unix und basieren auf ANSI
C. Für C++ gibt es zahlreiche Wrapper, die intern auf das C-Interface
zurück greifen. Du kannst also einen existierenden Wrapper (siehe
google) verwenden oder schreibst dir deinen eigenen.

Für eine C++ konforme Implementierung bietet sich eine statische
Klasenmethode an, sie ist kompatibel zur C-Funktion:

class Thread {
public:
static void* ThreadMain( void* _arg );
};

Soll der Thread eine Mebmer-Funktion aufrufen, sieht der Code etwa wie
folgt aus:

void Thread::run()
{
pthread_create( &Thread::ThreadMain, reinterpret_cast<void*>(this) );
}

void Thread::ThreadMain( void* _arg )
{
Thread* object = reinterpret_cast<Thread*>( _arg );
object->my_member_method();
}

Gruß Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Torsten Robitzki
Guest





PostPosted: Sun Oct 10, 2004 12:36 pm    Post subject: Re: Threads mit C++ Reply with quote



Markus Breuer wrote:
<snip>

Quote:
Die p(osix)-threads gibt es nur unter Linux/Unix und basieren auf ANSI
C.

Es gibt auch Implementierungen für Windows und auch für OpenVMS und
sicher auch für viele anderen Systeme.

Quote:
Für C++ gibt es zahlreiche Wrapper, die intern auf das C-Interface
zurück greifen. Du kannst also einen existierenden Wrapper (siehe
google) verwenden oder schreibst dir deinen eigenen.

Für eine C++ konforme Implementierung bietet sich eine statische
Klasenmethode an, sie ist kompatibel zur C-Funktion:

Kann so sein, muß aber nicht so sein. Der portable Weg wäre eine extern
"C" deklarierte Funktion, die wiederrum die Funktion des Objekts
aufruft. Beim casten von void* auf einen Zeiger der verwendeten Klasse
reicht ein static_cast im übrigen völlig aus.


mfg Torsten

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Torsten Robitzki
Guest





PostPosted: Sun Oct 10, 2004 12:38 pm    Post subject: Re: Threads mit C++ Reply with quote

Quote:
Gibt es speziell für C++ Threads, so dass ich auch Memberfunctions nutzen
kann? Dass ich keinen Hybriden aus C und C++ bauen muss, wie bei pthreads?

Jep, boost.org hat (fast) alles was das Herz begehrt.

mfg Torsten

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Michael Gebhart
Guest





PostPosted: Sun Oct 10, 2004 1:06 pm    Post subject: Re: Threads mit C++ Reply with quote

Hi,

danke für den Tipp!

Quote:
void Thread::ThreadMain( void* _arg )
{
Thread* object = reinterpret_cast<Thread*>( _arg );
object->my_member_method();
}

müsste das nicht void *Thread::ThreadMain.. heißen?

Oder sogar static void? Oder legt man das static bei C++ nur in der
Klassendeklaration an?


Warum muss ich beim pthread_create dann &Thread:: nutzen? Kann ich nicht
auch nur Thread:: nehmen?

Gruß

Michael
Quote:
Michael Gebhart wrote:
Hi zusammen,

ich möchte Threads in einem C++ Programm nutzen. Also wirklich C++ und
kein C. Ich habe versucht mit pthreads zu arbeiten, was jedoch nicht
funktioniert. Ich muss bei pthreads einen Pointer auf eine Funktion
setzen und kann dafür keine Memberfunction nehmen.

Gibt es speziell für C++ Threads, so dass ich auch Memberfunctions nutzen
kann? Dass ich keinen Hybriden aus C und C++ bauen muss, wie bei
pthreads?

Die p(osix)-threads gibt es nur unter Linux/Unix und basieren auf ANSI
C. Für C++ gibt es zahlreiche Wrapper, die intern auf das C-Interface
zurück greifen. Du kannst also einen existierenden Wrapper (siehe
google) verwenden oder schreibst dir deinen eigenen.

Für eine C++ konforme Implementierung bietet sich eine statische
Klasenmethode an, sie ist kompatibel zur C-Funktion:

class Thread {
public:
static void* ThreadMain( void* _arg );
};

Soll der Thread eine Mebmer-Funktion aufrufen, sieht der Code etwa wie
folgt aus:

void Thread::run()
{
pthread_create( &Thread::ThreadMain, reinterpret_cast<void*>(this) );
}

void Thread::ThreadMain( void* _arg )
{
Thread* object = reinterpret_cast<Thread*>( _arg );
object->my_member_method();
}

Gruß Markus


--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Michael Gebhart
Guest





PostPosted: Sun Oct 10, 2004 1:07 pm    Post subject: Re: Threads mit C++ Reply with quote

Hi,

danke für die Antwort. Ja Qt kenne ich, gefällt mir auch sehr gut.
Allerdings ist die kommerzielle Lizenz zu teuer und das Programm, was ich
grad schreibe darf nicht Open Source sein. Sonst gerne.

Das mit der statischen Methode scheint zu klappen.

Merci

Michael

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Michael Gebhart
Guest





PostPosted: Sun Oct 10, 2004 1:08 pm    Post subject: Re: Threads mit C++ Reply with quote

Hi,

danke für den Tipp. Boost ist noch nicht im Standard oder? Werde aber mal
einen Blick drauf werfen.

Gruß

Michael

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
M. Hrabowski
Guest





PostPosted: Sun Oct 10, 2004 2:33 pm    Post subject: Re: Threads mit C++ Reply with quote

Hallo,

Qt bietet eine Anzahl von Klassen, die sehr komfortabel die Entwicklung von
multi-threaded Anwendungen erlauben (QThread, QMutex, QWaitCondidion,
QSemaphore).
Allerdings ist das Ganze eh über pthreads implementiert (zumindest auf
linux), so dass man sich solche Klassen mit Hilfe von pthreads auch relativ
leicht selbst schreiben kann, wenn man nicht Qt verwenden will.

Das Problem mit dem pthread_create kannst Du Du auflösen, indem Du
pthread_create einen pointer auf eine statische Methode (z.B.
start(void*) ) übergibst und als argument für start() den (auf void*
gecastetetn) pointer auf Dein eigentliches Thread Object. Über diesen
pointer kannst Du dann eine virtuelle methode Deines Thread Objectes
aufrufen, die Du durch ableiten implementieren kannst, hier ein minimales
Beispiel (ungetestet):

class Thread
{
public:

Thread() : thread(0) {}
virtual ~Thread() {};

void start()
{
int err = pthread_create( &thread, 0, &Thread::thread_function, this );
if( err != 0 )
{
/* da ging was schief */
}
}

protected:

virtual void run () = 0;

private:
pthread_t thread;

// das hier wird über pthread_create gestartet
static void *thread_function( void *instance );
{
Thread *t_ptr = static_cast<Thread*>(instance);
t_ptr->run();
pthread_exit(0);
return 0;
}

};

Gruß
Maxim

Quote:
Hi zusammen,

ich möchte Threads in einem C++ Programm nutzen. Also wirklich C++ und
kein C. Ich habe versucht mit pthreads zu arbeiten, was jedoch nicht
funktioniert. Ich muss bei pthreads einen Pointer auf eine Funktion setzen
und kann dafür keine Memberfunction nehmen.

Gibt es speziell für C++ Threads, so dass ich auch Memberfunctions nutzen
kann? Dass ich keinen Hybriden aus C und C++ bauen muss, wie bei pthreads?

Gruß

Mike


--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Breuer
Guest





PostPosted: Sun Oct 10, 2004 9:33 pm    Post subject: Re: Threads mit C++ Reply with quote

Michael Gebhart wrote:
Quote:
Hi,

danke für den Tipp!


void Thread::ThreadMain( void* _arg )
{
Thread* object = reinterpret_cast<Thread*>( _arg );
object->my_member_method();
}

müsste das nicht void *Thread::ThreadMain.. heißen?

Stimmt, das war mein Fehler.

Quote:
Oder sogar static void? Oder legt man das static bei C++ nur in der
Klassendeklaration an?

"static" steht nur in der Deklaration und kennzeichnet diese Methode als
Klassenmethode. Analog wird das bei Klassenvariablen auch so angewendet.

Quote:
Warum muss ich beim pthread_create dann &Thread:: nutzen? Kann ich nicht
auch nur Thread:: nehmen?

Du möchtest die Adresse einer Funktion haben, also holst du sie dir
mittels address-of operator. Ältere Compiler haben gerne auf das &
verzichtet, aktuellere Compiler sind da pingeliger. Mit & ist es richtig
und sollte auf alten und neuen Compilern laufen.

Gruß Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Breuer
Guest





PostPosted: Sun Oct 10, 2004 9:42 pm    Post subject: Re: Threads mit C++ Reply with quote

Torsten Robitzki wrote:
Quote:
Markus Breuer wrote:

Für eine C++ konforme Implementierung bietet sich eine statische
Klasenmethode an, sie ist kompatibel zur C-Funktion:

Kann so sein, muß aber nicht so sein. Der portable Weg wäre eine extern
"C" deklarierte Funktion, die wiederrum die Funktion des Objekts
aufruft. Beim casten von void* auf einen Zeiger der verwendeten Klasse
reicht ein static_cast im übrigen völlig aus.

Die OOA'ler kennen nur Objekte und können mit klassenlosen Funktionen
nichts anfangen Surprised) das extern "C" lässt sich aber sicherlich auch auf
die static-Methode anwenden.

Beim casten von/nach void* bevorzuge ich den reinterpret_cast, das
trifft es meiner Meinung nach am nächsten. Re-Interpretiere den gegeben
Zeiger als ... . Desweiteren bleibt der Zeiger hierbei in jedem Fall
gleich. Zugegeben void* ist der unkritische Fall, bei zwei verwandten
Zeigern kann unter ungünstigen Umständen aber etwas anderes Dabei
herauskommen.
Davon aber einmal abgesehen, wofür könnte man reinterpret-cast noch
verwenden? Wenn es rein um den Zeiger geht, verwende ich stets dieses
cast, static- und dynamic-cast werden erst dann wichtig, wenn es um das
dahinter liegende Objekt bzw. dessen Typ geht.

Gruß Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Sun Oct 10, 2004 11:29 pm    Post subject: Re: Threads mit C++ Reply with quote

Markus Breuer wrote:

Quote:
Michael Gebhart wrote:
Hi zusammen,

ich möchte Threads in einem C++ Programm nutzen. Also wirklich C++ und
kein C. Ich habe versucht mit pthreads zu arbeiten, was jedoch nicht
funktioniert. Ich muss bei pthreads einen Pointer auf eine Funktion
setzen und kann dafür keine Memberfunction nehmen.

Gibt es speziell für C++ Threads, so dass ich auch Memberfunctions nutzen
kann? Dass ich keinen Hybriden aus C und C++ bauen muss, wie bei
pthreads?

Die p(osix)-threads gibt es nur unter Linux/Unix

Auf allen posix-Systemen eben :)

Quote:
und basieren auf ANSI C.
Für C++ gibt es zahlreiche Wrapper, die intern auf das C-Interface
zurück greifen. Du kannst also einen existierenden Wrapper (siehe
google) verwenden oder schreibst dir deinen eigenen.

Für eine C++ konforme Implementierung bietet sich eine statische
Klasenmethode an, sie ist kompatibel zur C-Funktion:

Streng genommen ist sie das nicht. Es müßte eigentlich eine Funktion sein,
die als extern "C" deklariert ist, was (auch statische) Memberfunktionen
ausschließt. Es müßte also eine nicht-Member-Funktion sein, was aber auch
kein Problem ist.

Quote:

class Thread {
public:
static void* ThreadMain( void* _arg );
};

Wieso public?

Quote:
Soll der Thread eine Mebmer-Funktion aufrufen, sieht der Code etwa wie
folgt aus:

void Thread::run()
{
pthread_create( &Thread::ThreadMain, reinterpret_cast<void*>(this) );

Zur Konvertierung nacht void* braucht man keinen Cast. Nur in die andere
Richtung wird er benötigt.

Quote:
}

void Thread::ThreadMain( void* _arg )
{
Thread* object = reinterpret_cast<Thread*>( _arg );
object->my_member_method();
}

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Werner Salomon
Guest





PostPosted: Mon Oct 11, 2004 7:18 am    Post subject: Re: Threads mit C++ Reply with quote

Michael Gebhart <mail (AT) miketech (DOT) net> wrote

Quote:
Hi zusammen,

ich möchte Threads in einem C++ Programm nutzen. Also wirklich C++ und kein
C. Ich habe versucht mit pthreads zu arbeiten, was jedoch nicht
funktioniert. Ich muss bei pthreads einen Pointer auf eine Funktion setzen
und kann dafür keine Memberfunction nehmen.

Gibt es speziell für C++ Threads, so dass ich auch Memberfunctions nutzen
kann? Dass ich keinen Hybriden aus C und C++ bauen muss, wie bei pthreads?

Hallo Mike,

da kann ich Dir die boost.thread Library wärmstens empfehlen. Soll
Dein Thread in einer Member-Funktion laufen, so kann das in etwa so
aussehen:
// ----8<----
#include #include <boost/bind.hpp>

class Foo {
public:
explicit Foo( int x = 42 );
private:
void Run( int x ) {
// ... hier läuft der Thread
}

boost::thread m_thread; // Achtung MUSS letzter Member sein!
};

Foo::Foo( int x )
: m_thread( boost::bind( &Foo::Run, this, x ) )
{}
// ----8<----

Mit Hilfe des bind-Statements kannst Du auch Parameter mitgeben - hier
im Beispiel das 'x'.
(siehe <http://www.boost.org/libs/bind/bind.html>)

Gruß
Werner

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Andreas Dunke
Guest





PostPosted: Mon Oct 11, 2004 12:48 pm    Post subject: Re: Threads mit C++ Reply with quote

Werner Salomon wrote:
Quote:
// ----8<----
#include #include
class Foo {
public:
explicit Foo( int x = 42 );
private:
void Run( int x ) {
// ... hier läuft der Thread
}

boost::thread m_thread; // Achtung MUSS letzter Member sein!

Warum muß das der letzte Member sein?


Quote:
};

Foo::Foo( int x )
: m_thread( boost::bind( &Foo::Run, this, x ) )
{}
// ----8<----

Mit Hilfe des bind-Statements kannst Du auch Parameter mitgeben - hier
im Beispiel das 'x'.
(siehe http://www.boost.org/libs/bind/bind.html>)


Andreas

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Torsten Robitzki
Guest





PostPosted: Mon Oct 11, 2004 6:11 pm    Post subject: Re: Threads mit C++ Reply with quote

Markus Breuer wrote:
Quote:
Torsten Robitzki wrote:

Markus Breuer wrote:



Für eine C++ konforme Implementierung bietet sich eine statische
Klasenmethode an, sie ist kompatibel zur C-Funktion:


Kann so sein, muß aber nicht so sein. Der portable Weg wäre eine
extern "C" deklarierte Funktion, die wiederrum die Funktion des
Objekts aufruft. Beim casten von void* auf einen Zeiger der
verwendeten Klasse reicht ein static_cast im übrigen völlig aus.


Die OOA'ler kennen nur Objekte und können mit klassenlosen Funktionen
nichts anfangen Surprised) das extern "C" lässt sich aber sicherlich auch auf
die static-Methode anwenden.

Das ist das Problem des OOA'lers, wenn er nicht über den Tellerrand
gucken möchte. Pthread ist eine Library mit C binding und von daher muß
es nicht mit einer Klassenfunktion funktionieren, neben dem Namen der
Funktion spielt z.B. auch die unterschiedlichen Aufrufskonventionen der
unterschiedlichen Sprachen eine Rolle. So ist es bei C üblich, das der
Aufrufer die Argumente eines Funktionsaufrufs wieder vom Stack entfernt,
bei anderen Sprachen, das die gerufene Funktion dies tut.

Quote:

Beim casten von/nach void* bevorzuge ich den reinterpret_cast, das
trifft es meiner Meinung nach am nächsten. Re-Interpretiere den gegeben
Zeiger als ... . Desweiteren bleibt der Zeiger hierbei in jedem Fall
gleich. Zugegeben void* ist der unkritische Fall, bei zwei verwandten
Zeigern kann unter ungünstigen Umständen aber etwas anderes Dabei
herauskommen.

reinterpret_cast ist Implementierungsabhängig und zum Teil nicht das was
Du möchtest, bei Mehrfachvererbung, wird durch den static_cast z.B.
nötige Verschiebungen der Adresse vorgenommen, die nicht von
reinterpret_cast vorgenommen werden.

Quote:
Davon aber einmal abgesehen, wofür könnte man reinterpret-cast noch
verwenden?

Um z.B. ein void* auf int zu casten und umgekehrt.

Quote:
Wenn es rein um den Zeiger geht, verwende ich stets dieses
cast, static- und dynamic-cast werden erst dann wichtig, wenn es um das
dahinter liegende Objekt bzw. dessen Typ geht.

Dann hast Du bis jetzt vielleicht einfach Glück gehabt ;-)

mfg Torsten

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Michael Karcher
Guest





PostPosted: Mon Oct 11, 2004 6:12 pm    Post subject: Re: Threads mit C++ Reply with quote

Andreas Dunke <NO_SPAM_adunke (AT) maku (DOT) de> wrote:
Quote:
class Foo {
public:
explicit Foo( int x = 42 );
private:
void Run( int x ) {
// ... hier läuft der Thread
}

boost::thread m_thread; // Achtung MUSS letzter Member sein!

Warum muß das der letzte Member sein?

Habe ich mich auch zuerst gefragt. Wahrscheinlich sollte hier ausführlicher
kommentiert werden.

Quote:
};

Foo::Foo( int x )
: m_thread( boost::bind( &Foo::Run, this, x ) )
{}

Im Konstruktor von boost::thread wird der neue Thread gestartet, wenn ich
das richtig sehe. Dieser sollte natürlich keine unkonstruierten Datenobjekte
sehen, das heißt, der Konstruktor von thread sollte nach allen anderen
Memberkonstruktoren ausgeführt werden, und da sich die
Ausführungsreihenfolge nicht nach der Sortierung der Initialisierungsliste
sondern der Deklarationsreihenfolge richtig, muss das Threadobjekt als
letztes deklariert werden.

Michael Karcher

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.