FWIW, here is a quick example (in the form of a fully compliable program
with error checking omitted) of how I use POSIX threads within a C++
environment:
_______________ _______________ _______________ _______________ _____
/* Simple Thread Object
_______________ _______________ _______________ _______________ __*/
#include <pthread.h>
extern "C" void* thread_entry(vo id*);
class thread_base {
pthread_t m_tid;
friend void* thread_entry(vo id*);
virtual void on_thread_entry () = 0;
public:
virtual ~thread_base() = 0;
void thread_run() {
pthread_create( &m_tid, NULL, thread_entry, this);
}
void thread_join() {
pthread_join(m_ tid, NULL);
}
};
thread_base::~t hread_base() {}
void* thread_entry(vo id* state) {
reinterpret_cas t<thread_base*> (state)->on_thread_entr y();
return 0;
}
template<typena me T>
struct thread : public T {
thread() : T() {
this->thread_run() ;
}
~thread() {
this->thread_join( );
}
template<typena me T_p1>
thread(T_p1 p1) : T(p1) {
this->thread_run() ;
}
template<typena me T_p1, typename T_p2>
thread(T_p1 p1, T_p2 p2) : T(p1, p2) {
this->thread_run() ;
}
// [and on and on for for params...]
};
/* Simple Usage Example
_______________ _______________ _______________ _______________ __*/
#include <string>
#include <cstdio>
class worker : public thread_base {
std::string const m_name;
void on_thread_entry () {
std::printf("(% p)->worker(%s)::on _thread_entry() \n",
(void*)this, m_name.c_str()) ;
}
public:
worker(std::str ing const& name)
: m_name(name) {
std::printf("(% p)->worker(%s)::my _thread()\n",
(void*)this, m_name.c_str()) ;
}
~worker() {
std::printf("(% p)->worker(%s)::~m y_thread()\n",
(void*)this, m_name.c_str()) ;
}
};
int main(void) {
{
thread<workerwo rkers[] = {
"Chris",
"John",
"Jane",
"Steve",
"Richard",
"Lisa"
};
worker another_worker( "Jeff");
another_worker. thread_run();
another_worker. thread_join();
}
std::puts("\n\n \n_____________ _____\nhit <ENTERto exit...");
std::fflush(std out);
std::getchar();
return 0;
}
_______________ _______________ _______________ _______________ _____
IMVHO, this is very straight forward and works well. In fact, I think I like
it better than the Boost method... Humm... Well, what do you all think about
the design? Is it crap?