【问题标题】:cannot convert from type void*(classname::) () to type void*(*)(void*)无法从类型 void*(classname::) () 转换为类型 void*(*)(void*)
【发布时间】:2012-08-20 18:29:53
【问题描述】:
class Scoreget{
    private:
        //some variables
    public:
        Scoreget(){
            //something here
        }

        void* basicgetscore(){
            //somthing here
        }

        void getscore(Scoreget s){
            pthread_t t;
            if(pthread_create(&t,NULL,s.basicgetscore,NULL)==-1){
               printf("Error 3\n");
               exit(3);
            }
            void *a;
            if(pthread_join(t,&a)==-1){
               printf("Error \n);
               exit(4);
            }
        }
};

我正在尝试运行一个单独的线程来调用函数,因为它使用对 execl() 的调用,因此会停止我的程序(我在 Windows 上,不能使用 fork())。将线程与类结合起来让我很难受。

通过谷歌搜索,我了解到我需要将最后一个函数设为朋友或静态,并使用某种 this 指针。我已经尝试过,但零件不合身。我什至无法更改错误类型。现在让我很沮丧。得到同样的错误:

无法将 Scoreget::basicgetscore 从类型 void*(Scoreget::)() 转换为类型 void* (*) (void *)

【问题讨论】:

  • @^ :老实说,我到处搜索。现在,如果人们没有正确包含我们在遇到时搜索的错误,我怎么会知道该帖子存在?该错误可能出现在标题中,因此搜索可能会向我显示一些内容。 :-/
  • 这个问题有很多重复。

标签: c++ multithreading


【解决方案1】:

将其声明为静态,并添加另一个辅助方法:

static void* basicgetscore(void * object){
    return ((Scoreget *) object)->dobasicgetscore();
}

void * dobasicgetscore() // new helper method
{
    // do stuff here
    return NULL;
}

使用以下方法创建 pthread:

if (pthread_create(&t,NULL,basicgetscore,&s) == -1) { ...

另外,要非常小心。你给这个线程一个临时变量的地址。在这种特定情况下是安全的,因为 pthread_join 在同一个函数中,但是如果您要在线程退出之前从该函数返回,您将释放正在运行线程的对象,这可能会导致各种讨厌的行为。考虑将您的函数更新为 1) 获取引用或指针或 2) 对 this 进行操作。

【讨论】:

    【解决方案2】:

    您不能将非静态方法传递给 pthread_create

    最简单的方法,创建运行basicgetscore的静态方法

    类似的东西

    static void *Scoreget::basicgetscore_starter(void *p) {
        Scoreget *t = (Scoreget *)p;
        t->basicgetscore();
    }
    
    pthread_create(&t,NULL,&Scoreget::basicgetscore_starter,(void *)&s);
    

    【讨论】:

    • 意味着创建一个包装函数,它只包含对 basicgetscore() 的调用,我们称之为 static_basicgetscore(),现在只需将这个新创建的函数的名称放在 pthread_create() 中?
    • 是的,不要忘记将 &s 作为 pthread_create 的最后一个参数传递
    • 这很好,但我认为你也可以使用 std::mem_fn 或 boost::mem_fn 魔法来完成同样的任务——尽管正确的语法并非易事。
    【解决方案3】:

    您需要定义一个非成员(静态)函数作为pthread_create() 的线程函数传递。从您的对象引用没有帮助,因为这是该函数所期望的函数指针。不过,您可以使用用户 args void* 指针将指针传递给您的对象实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      相关资源
      最近更新 更多