Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法从类型void*(类名::)()转换为类型void*(*)(void*)_C++_Multithreading - Fatal编程技术网

C++ 无法从类型void*(类名::)()转换为类型void*(*)(void*)

C++ 无法从类型void*(类名::)()转换为类型void*(*)(void*),c++,multithreading,C++,Multithreading,我正在尝试运行一个单独的线程来调用函数,因为它使用对execl()的调用,因此将停止我的程序(我在windows上,无法使用fork()。把线程和类结合在一起给我带来了困难 通过一些谷歌搜索,我了解到我需要将最后一个函数设置为friend或static,并使用某种类型的指针。我试过我的部分,但各部分不匹配。我甚至无法更改错误类型。现在我很沮丧。获取相同的错误: 无法将Scoreget::basicgetscore从类型void*(Scoreget::)()转换为类型void*(*)(void*)

我正在尝试运行一个单独的线程来调用函数,因为它使用对execl()的调用,因此将停止我的程序(我在windows上,无法使用fork()。把线程和类结合在一起给我带来了困难

通过一些谷歌搜索,我了解到我需要将最后一个函数设置为friend或static,并使用某种类型的指针。我试过我的部分,但各部分不匹配。我甚至无法更改错误类型。现在我很沮丧。获取相同的错误:

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


不能将非静态方法传递给pthread\u create

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

像这样的

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);
            }
        }
};

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

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

static void *Scoreget::basicgetscore_starter(void *p) {
    Scoreget *t = (Scoreget *)p;
    t->basicgetscore();
}

pthread_create(&t,NULL,&Scoreget::basicgetscore_starter,(void *)&s);
使用以下命令创建pthread:

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

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

另外,要非常小心。你给这个线程一个临时变量的地址。在这种特定情况下是安全的,因为pthread_join在同一个函数中,但是如果在线程退出之前从函数返回,则会释放运行线程的对象,这可能会导致各种恶劣行为。考虑将您的函数更新为1(引用引用或指针或2)操作<代码> < < />代码> < /p>意味着创建一个包装器函数,该函数只包含对Basic GeCeSeCe()的调用,让它称为STATICH-BASICGETCORE(),现在简单地将这个新创建的函数的名称放在pthRead SkEdio()中,是的,别忘了将&s作为pthread_creates的最后一个参数传递这很好,但我认为您也可以使用std::mem_fn或boost::mem_fn magic实现同样的功能,尽管正确的语法并不简单。现在,如果人们没有正确地包含我们在遇到错误时搜索的错误,我怎么会知道这个帖子的存在呢?这个错误可能出现在标题中,所以搜索可能会向我显示一些东西-/这个问题有很多重复的地方。
if (pthread_create(&t,NULL,basicgetscore,&s) == -1) { ...