在 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 更少(我正在为 MCU 开发它,而不是为 PC 开发,因此 RAM 的使用很重要)。它也不需要虚拟析构函数。
此外,我认为它更有意义,因为典型的对象而不是 HAS-A 线程(组合),而不是 IS-A 线程(继承),对吧?(;
与继承方法相反,这种设计是否有任何缺陷,因为我在任何地方都没有看到它建议?您肯定会为每个实例化获取 _trampoline() 的副本,但这与继承版本中的虚函数调用没有太大区别......我希望 create() 和 getHandle() 将被内联,因为没有理由不...