Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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++ 多分叉过程无限循环_C++_Parallel Processing_Fork - Fatal编程技术网

C++ 多分叉过程无限循环

C++ 多分叉过程无限循环,c++,parallel-processing,fork,C++,Parallel Processing,Fork,我不确定该如何描述这个问题,我很确定它不是一个无限循环(尽管它一直在运行而不退出),因为它看起来程序甚至都没有开始执行(我把一个cout 另外,因为您在启动每个进程时都会等待它,所以一次只运行一个进程,并行运行进程不会提高速度。那么..进程有多大?(一定要记住每个子进程也在for循环中,因此父进程将分叉进程子进程,第一个子进程分叉进程-1,它的第一个子进程和父进程第二个子进程分叉进程-2,等等。看这是怎么回事?)两个问题,一个巨大的问题。首先,你没有设置匹配项。匹配项应该是什么?其次,360/进

我不确定该如何描述这个问题,我很确定它不是一个无限循环(尽管它一直在运行而不退出),因为它看起来程序甚至都没有开始执行(我把一个cout
另外,因为您在启动每个进程时都会等待它,所以一次只运行一个进程,并行运行进程不会提高速度。

那么..进程有多大?(一定要记住每个子进程也在for循环中,因此父进程将分叉
进程
子进程,第一个子进程分叉
进程-1
,它的第一个子进程和父进程第二个子进程分叉
进程-2
,等等。看这是怎么回事?)两个问题,一个巨大的问题。首先,你没有设置
匹配项
匹配项
应该是什么?其次,
360/进程
?哇!你真的一次生成360+个进程吗?祝你好运。如果生成的进程少于360个,
360/进程
为零,什么都没有完成。那是什么您正在尝试这样做?进程介于1和8之间。是的,子进程不应该相互分叉,我如何防止这种情况发生?@David Hammen:我应该澄清这只是代码的一部分,匹配设置较早,应该在10和10000之间。如果我为示例生成4个进程,我生成的进程不到360个mpe 360/进程将是90。我有360个任务要完成,我正在尝试在进程之间平均分配。@WhozCraig no,每个子进程调用exit(0)。+1漂亮的鹰眼。我不确定
waitpid
也应该在这个for循环中(我现在看到您也被捕获了),因为似乎父母等待它刚刚产生的每个孩子并不比序列化好。不管怎样,很好的捕获。哦,非常感谢这是非常愚蠢的,我用所有分叉的东西让自己兴奋不已,并确信这就是问题所在。是的,这是一个关于进程可分割的好观点,我的老师很友好,并明确指出了这一点进程将是1、2、4、6和8,我想正是出于这个原因。不过,你的方式肯定会更好,我以后会记住这个诀窍。@user1023465请注意最后一段。将
waitpid
逻辑移到这个循环之外的自己的循环中。这是一个单独的问题,值得自己投票,如果我可以的话我会的。真的是一个很好的答案。哦,这很有道理,我明白你在说什么。是的,谢谢你指出这一点
for (int p = 0; p < processes; p++)
{
    if ((pids[p] = fork()) == 0)
    {
        for(int v = p * (360/processes); p < (360/processes) * (p + 1); p++)
        {
            for (int i = 0; i < 360; i+=5)
            {
                match temp_match;
                float dissimilarity = 0;
                //calculate dissimilarity
                for (int j = 0; j < size; j++)
                {
                    dissimilarity += fabs(test_vector[j] - (search_set[v].vect)[(i + j) % 360]);
                }
                temp_match.x = search_set[v].x;
                temp_match.y = search_set[v].y;
                temp_match.offset = i;
                temp_match.dissimilarity = dissimilarity;
                result.push_back(temp_match);
            }
            //only keep keep the few with the smallest dissimilarity
            std::sort(result.begin(), result.end(), sort_function);
            result.resize(matches); 
        }
        for(int i = p * matches; i < (p + 1) * matches; i++)
        {
            *(shm + i * 4) = result[i].x;
            *(shm + i * 4 + 1) = result[i].y;
            *(shm + i * 4 + 2) = result[i].offset;
            *(shm + i * 4 + 3) = result[i].dissimilarity;
        }
        exit(0);
    }
    else if (pids[p] < -1)
    {
        cout << "uh oh";
        exit(1);
    }
    else
    {
        waitpid(pids[p], NULL, 0);
    }
}
for(int v = p * (360/processes); p < (360/processes) * (p + 1); p++)
for(int v = (p * 360) / processes; v < ((p + 1) * 360) / processes; v++)