我正在尝试编写一个程序,该程序可以扩展以基于内核数使用动态数量的pthread来并行化简单算法。该算法很简单,它需要输入的整数数组,并且如果每个位置都是%10!= 0,则它将0存储在相应的输出数组位置中,否则将存储10。我不认为问题就在这里,因为它是如此简单的问题...但是我不明白为什么这行不通:
/*This variable is our reference to the child threads */
pthread_t childThreads[threadCount];
/*
...other setup code to initialize the parameters...
*/
/* create child threads*/
for(int i = 0; i< threadCount; i++)
{
printf("running_P...\n");
if(pthread_create(&(childThreads[i]), NULL, runParallelAlgorithm, (void *) &(parallelDataPakages[i])))
{
fprintf(stderr, "Error creating thread\n");
return 1;
}
}
/* join child threads*/
for(int i = 0; i< threadCount; i++)
{
if(pthread_join(childThreads[i], NULL))
{
fprintf(stderr, "Error joining thread\n");
return 2;
}
printf("not_running_P...\n");
}
的输出是:
running_P...
running_P...
running_P...
running_P...
not_running_P...
Error joining thread
Process returned 2 (0x2) execution time : 0.047 s
Press any key to continue.
我曾尝试寻找其他解决方案,但似乎大多数人都在尝试使用相同的pthread_t变量来创建线程,而我却拥有一个数组...但是它似乎仍然无法加入?为什么?我试图将其缩减为仅相关代码,但是因为如有必要,我可以提供更多信息。
编辑:对不起,我没有提供足够的信息。实际的程序将近200行,我最初并不想在这里发布所有程序。但是,如果该问题不在本节中,则不确定导致此问题的原因。既然这不是问题,我将把要点与所包含的代码联系起来。导致问题的实际联接位于第140行,很抱歉,我无法真正弄清它的具体含义:https://gist.github.com/firestar9114/d77b72254d4ef93664fbda14a9ed1a19
更新:pthread_join()
函数返回一个等于ESRCH
的整数,该整数被列为“找不到ID为 thread 的线程”。在手册中。我使用相同的childThreads[]
数组创建和加入线程,并且使用相同的threadCount
控制变量,该变量始终为4,所以我不明白为什么线程ID可以找不到?我尝试添加一个pthread_exit(NULL);
语句,但是它似乎仍然不起作用...给出此新信息的任何想法??
答案 0 :(得分:1)
您正在寻找完全错误的地方的问题。
根本原因是缓冲区溢出,在这里:
/*advance the element pointer*/
inputPointer = inputPointer + (sizeof(int) * elementsToProcess[i]);
outputPointer = outputPointer + (sizeof(int) * elementsToProcess[i]);
您想将int *inputPointer
和int *outputPointer
前进elementsToProcess[i]
。与int
的大小的乘积完全是伪造的:递增或递减指针会根据所指向类型的大小改变地址,因此,如果指向数组,则指向下一个或上一个元素。所以应该是
inputPointer = inputPointer + elementsToProcess[i];
outputPointer = outputPointer + elementsToProcess[i];
或更妙的是,
inputPointer += elementsToProcess[i];
outputPointer += elementsToProcess[i];
本质上,您的代码在其他数据上乱写,包括childThreads[]
和C库内部分配元数据。