c++ - 实现流水线模式,设计和函数指针问题

标签 c++

我正在尝试使用线程编写我自己的管道和过滤器模式解决方案,我想要一些输入。我当前的问题是我正在使用的库(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]);

关于c++ - 实现流水线模式,设计和函数指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28258700/

相关文章:

c# - CLR 中的派生类能否拦截/隐藏父类的方法,同时仍保持智能感知?

python - 如何编写一个函数来接受 SWIG 中的 Fraction 对象?

c++ - 在二进制文件中保存结构并在 C++ 中只读取值

c++ - C++ 的潜在语义分析/索引库

c++ - 将参数发送到 DLL 以进行 boost::bind'ed

c++ - 如何检查进程是否具有管理权限

c++ - std::vector 的自包含、STL 兼容实现

c++ - 物理引擎的循环模板类型名依赖

c++ - 使用默认构造函数初始化 std::vector

java - SWIG:使用导入的外部类型