如何使用pthread在c中管理多个线程?

时间:2018-11-09 19:13:28

标签: c parallel-processing pthreads

我正在尝试编写一个程序,该程序可以扩展以基于内核数使用动态数量的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);语句,但是它似乎仍然不起作用...给出此新信息的任何想法??

1 个答案:

答案 0 :(得分:1)

您正在寻找完全错误的地方的问题。

根本原因是缓冲区溢出,在这里:

        /*advance the element pointer*/
        inputPointer = inputPointer + (sizeof(int) * elementsToProcess[i]);
        outputPointer = outputPointer + (sizeof(int) * elementsToProcess[i]);

您想将int *inputPointerint *outputPointer前进elementsToProcess[i]。与int的大小的乘积完全是伪造的:递增或递减指针会根据所指向类型的大小改变地址,因此,如果指向数组,则指向下一个或上一个元素。所以应该是

        inputPointer = inputPointer + elementsToProcess[i];
        outputPointer = outputPointer + elementsToProcess[i];

或更妙的是,

        inputPointer += elementsToProcess[i];
        outputPointer += elementsToProcess[i];

本质上,您的代码在其他数据上乱写,包括childThreads[]和C库内部分配元数据。