最近我一直在设计Thread类库,我已经创建了一个Thread抽象类,如下所示:
class Thread { public: run() { /*start the thread*/ } kill() { /*stop the thread*/ } protected: virtual int doOperation(unsigned int, void *) = 0; };
真正的线程类将继承此抽象类并doOperation
在其自己的逻辑中实现方法,类似于策略模式.
问题是我依赖于一个C后端库,它定义了在以下函数中运行线程:
int startThread(char* name, (int)(*)(unsigned int, void*), int, int, int, void*);
如你看到的; 第二个参数是一个指向线程循环(main函数)的函数指针,这就是问题所在; 因为我使用这个C函数来启动run
方法中的线程,所以我将地址传递doOperation
给第二个参数,由于类型不匹配,这是无法完成的.
我试图用来reinterpret_cast
返回指针,但我ISO-C++禁止返回未初始化函数成员的指针.我不知道如何克服这种冲突,使用静态方法是我猜的唯一解决方案,但它打破了我的设计模式!
首先,请务必阅读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 ......; };
这个想法是doOperation,作为Thread的成员函数,不需要void*上下文,你可以保留你在对象本身中作为上下文传递的任何东西.因此,您可以使用void指针将实际指针传递给doOperation.请注意,void*详细信息对您的类的用户是隐藏的,这很好.