vis*_*213 8 c++ multithreading
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()).将线程与类结合起来给我带来了困难.
从一些谷歌搜索,我知道我需要制作最后一个功能的朋友或静态,并使用某种类型的指针.我试过了,但是碎片不合适.我甚至无法更改错误类型.现在让我很沮丧.得到同样的错误:
无法将Scoreget :: basicgetscore从void*(Scoreget ::)()类型转换为void*(*)(void*)
声明它是静态的,并添加另一个辅助方法:
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.
您不能将非静态方法传递给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);
| 归档时间: | 
 | 
| 查看次数: | 7231 次 | 
| 最近记录: |