Boost logo

Boost :

From: Eric Woodruff (Eric.Woodruff_at_[hidden])
Date: 2002-08-06 12:10:56


Here's another option:

As I suggest before, to use a secondary class with the specific
implementation in it, why not make it a flag that the user can set whether
to use a "PIMPL" or just a normal instance of it. Some people might rather
not have <windows.h> or <pthread.h> include in their dependency hierarchy --
this is after all, one of the key points of the abstraction.

Consider:

// thread.hpp

#ifdef BOOST_POLUTE_HEADER_AND_NAME_SPACE
#define BOOST_DONT_USE_PIMPL
#endif

#include <boost/thread/platform_implementations.hpp>

namespace boost {
    class thread {
        public:
            // ...

        private:
#ifdef BOOST_DONT_USE_PIMPL
            threads::PlatformSpecificThread platformThread; // i'll address
the pointer vs non-pointer
#else
            threads::PlatformSpecificThread* platformThread;
#endif
    };

}

// platform impelmentations.hpp

#include <boost/thread/win32_thread_implementation.hpp>
#include <boost/thread/posix_thread_implementation.hpp>

// win32_thread_implementation

#ifdef WIN32

#include <Windows.h>

namespace boost {
    namespace threads {
        class PlatformSpecificThread {
            //...

            HANDLE threadHandle;

            PlatformSpecificThread* operator-> () { return this; }
            // this will keep the code generic between PIMPL and PIMPL-free
        };
    }
}

#endif

// thread.cpp - win32 version

using boost::thread;

// only the constructor is sentient of the difference.

#ifndef BOOST_DONT_USE_PIMPL
#include <boost/thread/win32_thread_implementation.hpp>

thread::thread (...) {
}

#else
thread::thread (...)
    : platformThread (new threads::PlatformSpecificThead (this)) {
}

#endif

// a very trivialized but clean version of join (example only)
thread::join () {
    WaitForMultipleObjectsEx (platformThread->Handle,...);
}


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk