C++ のクラスのメンバー関数で pthread を使用する「典型的な」アプローチは、継承を使用することです (ここで提案されているようにhttps://stackoverflow.com/a/1151615/157344 )。しかし、なぜこのようなものではないのですか:
#include <pthread.h>
template <class T, void * (T::*thread)()>
class Thread
{
public:
int create(T *that) { return pthread_create(&_handle, nullptr, _trampoline, that); };
pthread_t getHandle() const { return _handle; };
private:
static void * _trampoline(void *that) { return (static_cast<T *>(that)->*thread)(); };
pthread_t _handle;
};
次のように使用できます。
class SomeClassWithThread
{
public:
int initialize() { return _thread.create(this); };
private:
void * _threadFunction();
Thread<SomeClassWithThread, &SomeClassWithThread::_threadFunction> _thread;
};
仮想関数を使用しないという利点があるため、vtable がなく、使用される RAM が少なくなります (PC ではなく MCU 用に開発しているため、RAM の使用が重要です)。また、仮想デストラクタも必要ありません。
さらに、典型的なオブジェクトは IS-A スレッド (継承) よりもむしろ HAS-A スレッド (構成) を持っているので、より理にかなっていると思いますよね? (;
継承方法とは対照的に、どこにも提案されていないので、そのような設計に欠陥はありますか? インスタンス化ごとに _trampoline() のコピーを確実に取得しますが、それは継承バージョンの仮想関数呼び出しと大差ありません... create() と getHandle() がインライン化されることを願っています。 ...