有人可以告诉我错误,因为pthread_join无法正常工作

时间:2018-10-03 16:00:29

标签: c multithreading pthreads

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
struct Array 
{
    //
};
void* evensum(void* param)
{
    //calculated the sum of even elements and returned it
}
void* oddsum(void* param)
{ 
  //did the same thing but for odd elements
}
int main()
{
    struct Array* obj=malloc(sizeof(struct Array));
    //did all the inputs
    int evensum,oddsum; 
    pthread_t thread1,thread2;
    pthread_create(&thread1,0,&evensum,(void*)obj);
    int evensum,oddsum;
    pthread_join(&thread,(void**)evensum);
    pthread_create(&thread2,0,&oddsum,(void*)obj);
    pthread_join(&thread2,(void**)oddsum);
    //try to print it using %i but I get or  %d 
    // I get the sum as zero
}

因此,我创建了两个单独的线程,这些线程旨在异步工作。我遵循了here中提到的建议,但是由于thread1完成执行后,联接仍然不起作用,尽管我遵循正确的语法,也从未创建另一个线程。任何想法如何解决这个问题? 此外,即使我在函数中打印正确的值,打印的值也为零。 这是我在每个函数的return语句中写的内容:

return (void*)sum;//variable that stores sum

我还想补充一点,我不想使用信号量或任何其他同步工具来做到这一点。

2 个答案:

答案 0 :(得分:1)

pthread_join的第二个参数是void **,即它期望指向void * pointer ,该参数将取消引用以将值存储在其中。没有传递变量的地址,此函数将尝试使用您传递的任何值作为地址(这可能是无效的)并取消引用它。这将调用undefined behavior

此外,第一个参数的类型为pthread_t,但您要将指针传递给pthread_t

您还要声明与所调用函数同名的局部变量。结果,当您调用pthread_create(&thread2,0,&oddsum,(void*)obj);时,实际上是在传递名为int的局部oddsum而不是传递名为oddsum的函数。这就是它挂起的原因。

更改变量名称以保存结果,更改pthread_join调用以传递这些变量的地址并直接传递线程ID应该可以:

int evenresult;
pthread_join(thread,(void**)&evenresult);
...
int oddresult;
pthread_join(thread2,(void**)&oddresult);

然而,获取结果的正确方法是传递实际void *变量的地址并进行转换:

int evenresult, oddresult;
void *result;
pthread_join(thread, &result);
evensum = (intptr_t)result;
...
pthread_join(thread2, &result);
oddsum = (intptr_t)result;

答案 1 :(得分:0)

创建所有线程,然后如下所示加入它们:-

pthread_create(&thread1,0,&evensum,(void*)obj);
pthread_create(&thread2,0,&oddsum,(void*)obj);

pthread_join(&thread1,(void**)evensum);
pthread_join(&thread2,(void**)oddsum);