2

最近我一直在设计一个 Thread 类库,我做了一个 Thread 抽象类,如下所示:

class Thread {
public:
    run() { /*start the thread*/ }
    kill() { /*stop the thread*/ }
protected:
    virtual int doOperation(unsigned int, void *) = 0;
};

真正的线程类会继承这个抽象类并doOperation以自己的逻辑实现方法,类似于Strategy Pattern

问题是我依赖于一个 C 后端库,它定义了在以下函数中运行线程:

int startThread(char* name, (int)(*)(unsigned int, void*), int, int, int, void*);

如你看到的; 第二个参数是一个指向线程循环(主函数)的函数指针,这就是问题所在;由于我使用这个 C 函数在run方法中启动线程,所以我将地址传递doOperation给第二个参数,但由于类型不匹配,这无法完成。

我尝试使用reinterpret_cast返回指针,但我 ISO-C++ 禁止返回未初始化函数成员的指针。我不知道如何克服这个冲突,我猜使用静态方法是唯一的解决方案,但这会破坏我的设计模式!

4

1 回答 1

7

首先,请务必阅读 Michael Burr 提供的链接,因为它包含很好的信息。然后,这里是它的 C++ish 伪代码:

int wrapperDoOperation(int v, void *ctx)
{
    Thread *thread = (Thread *)ctx;
    return thread->doOperation(v);
}

class Thread {
public:
    run() {
         startThread("bla", wrapperDoOperation, bla, bla, bla, (void *)this);
    }
    kill() { /*stop the thread*/ }
protected:
    virtual int doOperation(unsigned int) = 0;

friend wrapperDoOperation ......;
};

这个想法是,作为 Thread 的成员函数的 doOperation 不需要 void *context,您可以将要传递的任何内容作为上下文保留在对象本身中。因此,您可以使用 void 指针将实际的 this 指针传递给 doOperation。注意 void * 细节对你的类的用户是隐藏的,这很好。

于 2009-02-01T09:35:26.940 回答