64,642
社区成员
发帖
与我相关
我的任务
分享
void CMVPIndex::parallelLoadLeafToRoot(vector<shared_ptr<CIndexObject> >&dataObject)
{
ofstream out(fileName,ios::in|ios::out|ios::binary);
out.close();
filePointer=0;//the pointer of file
HANDLE tHandle;
vector<shared_ptr<Task> > newTaskList;
vector<shared_ptr<Task> > rootTask;
mutexA=CreateMutex(NULL,0,NULL);
mutexB=CreateMutex(NULL,0,NULL);
mutexO=CreateMutex(NULL,0,NULL);
if(dataObject.size()<=maxLeafSize)
rootAddress=-2;
else
rootAddress=-1;
shared_ptr<Task> task(new Task(dataObject,NULL,0,dataObject.size(),0,0));
//这儿用的事只能指针,莫非是只能指针释放内存时候出错?
this->taskList.push_back(task);
parallelBlock pba;
{
pba.fstr=&out;
pba.numPivots=&(this->numPivots);
pba.metric=this->metric;
pba.maxLeafSize=this->maxLeafSize;
pba.taskList=&(this->taskList);
pba.newTaskList=&newTaskList;
pba.pm=this->pm;
pba.psm=this->psm;
pba.singlePivotFanout=this->singlePivotFanout;
pba.numInternalNode=&(this->numInternalNodes);
pba.numLeafNode=&(this->numLeaf);
pba.fileName=this->fileName;
pba.filePointer=&(this->filePointer);
pba.rootAddress=&(this->rootAddress);
}
while(this->taskList.size()>0||threadANum>0)
{
if(this->taskList.size()>threadANum&&threadANum<3)
{
threadANum++;
tHandle=CreateThread(NULL,0,threadOfCreateInternalOrLeafNode,&pba,0,NULL);
CloseHandle(tHandle);
}
else
{
Sleep(2000);
}
}
while(this->taskList.size()>0||newTaskList.size()==0)
Sleep(5000);
parallelBlock pbb;
{
pbb.fstr=&out;
pbb.numPivots=&(this->numPivots);
pbb.metric=this->metric;
pbb.maxLeafSize=this->maxLeafSize;
pbb.taskList=&(this->taskList);
pbb.newTaskList=&newTaskList;
pbb.pm=this->pm;
pbb.psm=this->psm;
pbb.singlePivotFanout=this->singlePivotFanout;
pbb.numInternalNode=&(this->numInternalNodes);
pbb.numLeafNode=&(this->numLeaf);
pbb.fileName=this->fileName;
pbb.filePointer=&(this->filePointer);
pbb.rootAddress=&(this->rootAddress);
pbb.rootTask=NULL;
}
while(pbb.newTaskList->size()>0||threadBNum>0)
{
if(pbb.newTaskList->size()>threadBNum&&threadBNum<3)
{
threadBNum++;
tHandle=CreateThread(NULL,0,threadOfWriteInternal,&pbb,0,NULL);
CloseHandle(tHandle);
}
else
{
Sleep(2000);
}
}
while(pbb.newTaskList->size()>0||threadBNum>0||this->taskList.size()>0||threadANum>0)
Sleep(5000);
writeRoot(pbb.rootTask,out);
}