实现流水线模式、设计和函数指针问题

Implementing Pipeline Pattern, design and function pointer issue

本文关键字:函数 指针 问题 流水线 模式 实现      更新时间:2023-10-16

我正在尝试编写自己的管道解决方案和带有线程的过滤器模式,我想要一些输入。我目前的问题是我正在使用的库(tinythread)需要一个全局函数指针来启动线程:

thread  (void(*)(void *) aFunction, void * aArg )

我的 Stage 类有一个 Process 函数,我想将其作为函数指针传递。

class Stage
{
public:
    void Process(void *aArg);
protected:
    Stage(SharedBuffer *inPipe, SharedBuffer *outPipe);
    virtual void init() = 0;
    virtual bool work() = 0;
    virtual void finish() = 0;
protected:
    SharedBuffer *mInPipe;
    SharedBuffer *mOutPipe;
};

实现:

void Stage::Process(void * aArg)
{
    init();
    while(work());
    finish();
}

在我的管道类中,我以这种方式创建每个线程:

void Pipeline::Start()
{
    assert(mStages.size() > 0);
    for (size_t i = 0; i < mStages.size(); ++i)
    {
        tthread::thread t1(&mStages[i].Process, 0); //C2276
    }
}

我不知道我的设计是否有缺陷,我尝试编写自己的解决方案。我现在的问题是我似乎无法传递该函数,因为它是类成员。对我来说,将其作为静态函数没有意义,因为每个 Process 调用都来自 Stage 的不同子类。

Process是一个

类方法 - 它不是类的成员,因此引用它的语法不正确。此外,作为一个类方法,它必须在类的实例上调用 - 所以你需要一种方法来实际做到这一点。

值得庆幸的是,看起来库允许您传入上下文参数 - 在您的情况下应该是您的Stage*。因此,您需要做的就是创建一个与库期望的签名匹配的函数,该函数将执行正确的操作:

void CallProcess(void* stage) {
   static_cast<Stage*>(stage)->Process();
}

并将其传递:

tthread::thread t1(CallProcess   ,  &mStages[i]);
//                 void(*)(void*),  void*

请注意,在 C++11 中,我们实际上可以创建一个线程来直接调用Process

std::thread t1(&Stage::Process, mStages[i]);