这段代码会编译(使用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/

10-09 13:34