将指针施放为成员函数作为C函数的指针是一个好习惯吗?

Is it good practice to cast a pointer to a member function as a pointer to a C function

本文关键字:函数 指针 一个 好习惯 成员 施放      更新时间:2023-10-16

此代码编译(带有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,因为数据似乎依赖于编译器如何选择解释/编译此函数的怜悯。

之前已经涵盖过,但没有明确回答。

如何打破此示例?

旧方法(带有最近的语法)是:

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具有更好的接口。

不是真的。这是不确定的行为。虽然很可爱。它是否工作在空中有点升起。我的猜测是通常会。

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

的实现。

使用指针指向Classe的方法非常有用,对我而言,这是一个很好的做法,因为它允许您实现另一种模式,例如:触发事件,通过Severas类触发事件具有相同的方法原型。

回答您的问题:这是设计问题,以及如何对您的目标有用。

我共享一个代码,在其中创建拖曳线程在同一类的方法上不同,希望您能为您提供帮助。

https://github.com/jorgemedra/c-11-threads/blob/master/readme.md