c ++过程不会停止

时间:2016-03-29 01:38:48

标签: c++ multithreading

代码中有问题,但我不明白为什么。 我认为其中一个原因可能是我在代码中使用的线程。

代码看起来像这样。

在main.cpp

   vector<thread> t;
vector<future<myClass>> futures;
vector<myClass> chV;

for(int i = 0; i < NumberOfThreads; i++) // NumberOfThreads are 2 here
{
    promise<myClass> promises;
    futures.push_back(promises.get_future());
    t.push_back(thread(MyFunction ,i, PointsNumberInThreads , pointList, std::move(promises)));
}

for_each(t.begin(), t.end(), std::mem_fn(&std::thread::join));

for(int i = 0; i < futures.size(); i++ )
{
//        futures.at(i).get().fOut(i); // <-- if I comment out then it gives error. but why?
    chV.push_back(futures.at(i).get());
}
myClass c1 = chV.at(0);
myClass c2 = chV.at(1);
cout << "merge start" << endl; // <-- it prints out
c1.Merge(c2);
cout << "merge end" << endl; // <-- does not print out this message. so I have to kill the process

myClass.cpp中的Merge函数我在函数的底部有这些句子。

int aSt,aMid,aEnd;
int bSt,bMid,bEnd;

aSt = 0, aEnd = upperV.size(), aMid = (aEnd + aSt)/2;
bSt = 0, bEnd = b.upperV.size(), bMid = (bEnd + bSt)/2;

Point aPoint, bPoint, aPrev, aNext, bPrev, bNext;
aPoint = upperV.at(aMid);
aPrev = upperV.at(aMid-1);
aNext = upperV.at(aMid+1);
bPoint = b.upperV.at(bMid);
bPrev = b.upperV.at(bMid-1);
bNext = b.upperV.at(bMid+1);

bool done = true;

while(done)
{
    done = false;
    if(orientation(aPoint,bPoint,bPrev) > 0)
    {
        bEnd = bMid;
        bMid = (bEnd + bSt)/2;
        bPoint = b.upperV.at(bMid);
        done = true;
    }
    if(orientation(aPoint,bPoint,bNext) > 0)
    {
        bSt = bMid;
        bMid = (bEnd + bSt)/2;
        bPoint = b.upperV.at(bMid);
        done = true;
    }

    if(orientation(bPoint,aPoint,aPrev) < 0)
    {
        aEnd = aMid;
        aMid = (aEnd + aSt)/2;
        aPoint = upperV.at(aMid);
        done = true;
    }
    if(orientation(bPoint,aPoint,aNext) < 0)
    {
        aSt = aMid;
        aMid = (aEnd + aSt)/2;
        aPoint = upperV.at(aMid);
        done = true;
    }
}

cout << "aPoint = (" << aPoint.x << " , " << aPoint.y << ")" << endl;
cout << "bPoint = (" << bPoint.x << " , " << bPoint.y << ")" << endl;

并且它们被打印但是正如我所提到的那样,这个过程似乎继续在某个地方运行。

1 个答案:

答案 0 :(得分:0)

这是我认为你应该关注的代码部分。这可能 不是为什么你的代码会像你在问题中所说的那样继续执行,而是来自你提供给我们的代码;我仍然认为这是一个应该解决的问题。

orientation()

您最初将此设置为true。然后,您将进入while循环并将其设置为false。所有if语句都将其设置为true。因此,如果满足任何这些条件取决于 bool done = false; while ( !done ) { // terminating case - I usually almost always check for this first! if ( done ) { break; } // Do work here and one or more cases could trip done to be equal to true // within a if... else if ... else statement or within a series of if satements // or none of them can, but if they don't then it must be set at the end of the while loop. // Any one of these or all of them could set done = true and if they don't // then you should set done = true at the end of the while loop since // if none of these conditions are met, it will execute the assignment // before it begins to loop. if ( some condidition ) { // Do this } else if ( some other condidition ) { // Do this instead } else { // Then do this } // Or this: Any of these could trip done = true or none of them // and once again if none of them do, it should be the last thing done // before the ending brace to your while loop. if ( this ) { // Do Work; } if ( this ) { // Do Work; } // etc. // Set this last if none of the if statements trip done to be true; // otherwise if one or more does trip done, then you can omit this line. // Note: If none of the if statements trip this flag and you trip it here // in this section, this loop will occur only one time. done = true; } 返回的内容,那么您不会打破这个while循环。起初看起来似乎不合逻辑,但随着时间的推移,我学会了在这种结构中做循环的好方法。

GoodGuy.m