#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
我还想补充一点,我不想使用信号量或任何其他同步工具来做到这一点。
答案 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);