Re: Posix thread exiting and destructors
On Apr 10, 6:17 pm, "bjeremy" <bjer...@sbcglobal.net> wrote:
[...]
#ifndef Thread_H
#define Thread_H
#define _REENTRANT
class Thread
{
pthread_t thread;
static void * dispatch(void *);
protected:
virtual void run() = 0;
public:
virtual ~Thread(){}
void start();
void join();
};
#endif
.cpp file
-------------------------
#include "Thread.h"
void * Thread::dispatch(void * ptr)
{
if (!ptr)
return 0;
static_cast<Thread *>(ptr)->run();
pthread_exit(ptr);
You don't need to call pthread_exit here---in fact, in many
cases, you don't want to (since calling pthread_exit will, at
least in some implementations, prevent the destructors of local
variables from running). Just return. (Actually, you don't
want to ever call pthread_exit if you're using C++, because
implementations---even different compilers on the same
platform---don't seem to agree as to what it should do.)
return 0;
}
void Thread::start()
{
pthread_create(&thread, 0, Thread::dispatch, this);
Attention! This shouldn't compile (although g++ has a bug, and
doesn't detect the error). The type of function required by
pthread_create is `extern "C"', and a member function, even
static, can never be `extern "C"'.
}
void Thread::join()
{
pthread_join(thread, (void **) 0);
}
This is an ABC, as you can see the derived class must implement a
run() function... When you derived from this, you will call the
start() method wich will create the pthread.. .the creation will
callback the start() function which will execute the derived classes
run(). after run() finishes, pthread_exit() will be called to clean up
the memory.
What relationship to his question?
He was talking about calling pthread_exit in a destructor, which
makes me think that he probably had detached threads in mind.
For detached threads, I don't use a class at all; just a
(template) function, which takes a functional object (or a
pointer to function) as parameter.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34