这段代码会编译(使用g ++(GCC)6.3.1),似乎可以正常工作。但是我对它是否构成良好实践持怀疑态度。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
class ThreadObj
{
public:
void *memberFunction(void*);
void startThread(void);
static int w;
};
int ThreadObj::w = 13;
void* ThreadObj::memberFunction(void*)
{
w = 17;
return 0;
}
void ThreadObj::startThread(void)
{
void * (*p)(void *) = *((void * (*)(void *))&ThreadObj::memberFunction);
pthread_t tid;
if (pthread_create(&tid, 0, p, this) == 0)
pthread_detach(tid);
}
int main(int argc, char *argv[] )
{
ThreadObj thr;
thr.startThread();
return 0;
}
将指向成员函数的指针转换为C函数的指针,并在数据中传递
this
似乎依赖于(TOO MUCH)编译器选择如何解释/编译它的余地。之前已经对此进行了介绍,但没有给出明确的答案。
如何打破这个例子?
最佳答案
旧方法(使用最新语法)是:
class ThreadObj
{
public:
void memberFunction() { w = 17;}
void startThread() {
pthread_t tid;
if (pthread_create(&tid, 0, &Func, this) == 0) {
pthread_detach(tid);
}
}
static void* Func(void* p) {
auto* that = static_cast<ThreadObj*>(p);
that->memberFunction();
return nullptr;
}
private:
int w = 13;
};
但是在c ++ 11中,
std::thread
具有更好的接口。关于c++ - 将成员函数的指针转换为C函数的指针是一种好习惯吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42566829/