gpt4 book ai didi

c++ - C++ 中类的成员函数的 pthread - 为什么不是模板?

转载 作者:搜寻专家 更新时间:2023-10-31 01:50:59 25 4
gpt4 key购买 nike

在 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 使用很重要)。它也不需要虚拟析构函数。

此外,我认为这更有意义,因为典型的对象与其说是 IS-A 线程(继承),不如说是 HAS-A 线程(组合),对吗? (;

这种设计是否有任何缺陷,因为我没有在任何地方看到它建议,而不是继承方法?您肯定会为每个实例化获得 _trampoline() 的拷贝,但这与继承版本中的虚函数调用没有太大区别......我希望 create() 和 getHandle() 将被内联,因为没有理由不这样做...

最佳答案

这解决了“this”地址的问题

#include <pthread.h>

template <class T, void * (T::*thread)()>
class Thread
{
public:
int create(T* passedThis) { return pthread_create(&_handle, nullptr, _trampoline, passedThis); };
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;
};

关于c++ - C++ 中类的成员函数的 pthread - 为什么不是模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14399131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com