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