将指向成员函数的指针强制转换为指向C函数的指针是一种好习惯

时间:2017-03-02 21:59:42

标签: c++ pointers pthreads

此代码编译(使用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)编译器选择如何解释/编译它的优点。

以前已经介绍过,但没有明确答复。

如何破坏这个例子?

3 个答案:

答案 0 :(得分:1)

旧的方式(使用最近的语法)是:

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有更好的界面。

答案 1 :(得分:0)

不是真的。它的未定义行为。虽然很可爱。无论它是否有效都有点悬而未决。我的猜测通常是。

代码的作者正在利用this通常作为成员函数实现的第一个参数传递的事实。

答案 2 :(得分:0)

使用指向classe方法的指针是非常有用的,对我来说,这是一个很好的实践,因为它允许您实现另一种模式,例如:触发具有相同原型方法的severas类上的事件。

回答你的问题:这是一个设计问题以及它如何对你的目标有用。

我分享了一个代码,我在同一个类的differents方法中创建两个线程,我希望你能帮到你。

https://github.com/jorgemedra/C-11-Threads/blob/master/README.md