Pthread和void *尝试取消引用通用指针

时间:2013-01-24 20:13:09

标签: c++ void-pointers reinterpret-cast static-cast

当我调试PRJ时,我收到此错误:

  

args错误:报告了多个错误。\无法执行MI命令:-var-create -

     

args来自调试器后端的错误消息:尝试取消引用通用指针。\无法创建变量对象

从void * args转换为Mapper * arg时出现错误。

更新1

KMaster,KMapper分别实现了Master,Mapper但它们并没有添加任何rilevant。有效的是调用方法work()的KMapper。这是代码:

int main(){
    int np=1,K=4;
    string path="lucca.gps";
    KMaster* master=new KMaster(path,np,K);
    KMapper* mapper[np];
    master->splitting();
    for(int i=0;i<np;i++){
            mapper[i]=new KMapper(master,master->mData[i].key,master->mData[i].value);
            while(mapper[i]->work()!=0){
                cout<<"failed creating mapper, retry..."<<endl;
                sleep(1000);
            }
    }
}

int KMaster::splitting(){
    cout<<"start splitting"<<endl;
    fstream is(path.c_str());
    string s="";
    getline(is,s);
    while(!is.eof()){
        for(int i=0;i<nProc;i++){
            pair<double,double> res;
            is>>res.first;
            is>>res.second;
            is>>s;
            mapData[i].push_back(res);
            Data.push_back(res);
            if(is.eof()) break;
        }
    }        
    list<pair<double,double> >::iterator it=Data.begin();
    int increment=Data.size()/K;
    for(int i=0;i<K;i++){
        Klusters.push_back(*it);
        advance(it,increment);
    }
    for(int i=0;i<nProc;i++){
        mData[i].key=&Klusters;
        mData[i].value=&mapData[i];
    }
    cout<<"splitting completed"<<endl;
    return 0;
}

int Mapper::work(){
    Mapper* m=this;
    void* p=m;
    return pthread_create(&thread,NULL,start,p);
}

void* start(void* args){
    cout<<"start()"<<endl;
    Mapper* arg= reinterpret_cast<Mapper*>(args);
    arg->mapResult=arg->map(arg->k,arg->v);
    cout<<"Mapper finish, sending result..."<<endl;
    arg->send(arg->mapResult);
}

希望有人可以提供帮助!

更新2

调试器的屏幕截图:

eclipse debug

1 个答案:

答案 0 :(得分:0)

arg的值是24,没有任何普通对象可以使用,所以施法时没有任何关系。

不幸的是,这个“答案”只能是一个疯狂的猜测,因为你没有显示调用代码。

如果arg 总是 24,我会检查类似的内容:

class Something
{
public:
    void dostuff() { mapper.work(); }
private:
    // 24 bytes of "stuff" before this member (including possibly a vtable)
    Mapper mapper;
};

Something *thing = 0;
thing->dostuff(); // Thing->mapper will have address 24.

你也可能有一个未初始化的变量

Mapper* mapper;
mapper->work(); // Oops, uninitialised

恰好是24岁。