我试图通过使用线程来增加矩阵。我无法从线程返回值以显示在另一个函数中。
下面主要和第一个主题的示例代码。
void MC0(int *);
void Answer(int, int);
int c0=0, c1=0;
void MC0(int * c0){
c0 = arrayCopy[1]*arrayCopy[9]; //arrayCopy is a copy of the input from the main "argv"
pthread_exit(0);
}
void Answer(int c0, int c1){
printf("c0: %d c1: %d", c0, c1);
}
int main(int argc, char *argv[]){
pthread_create(&myThread1, NULL, (void *) MC0, (void *) &c0);
sleep(1);
pthread_create(&myThread2, NULL, (void *) MC1, (void *) &c1);
sleep(1);
pthread_join(myThread1, NULL);
sleep(1);
pthread_join(myThread2, NULL);
sleep(1);
Answer(c0, c1);
exit(0);
}
我可能需要对pthread_mutex_lock
做点什么,但我不知道该怎么做。我试图从c0
函数返回MC0
,以便能够使用printf
函数中的Answer(int, int)
进行显示。
答案 0 :(得分:1)
由于每个线程都在写一个全局变量,因此您不需要再做任何事情。在主线程执行pthread_join(myThread1, NULL)
之后,线程1已在地址&c0
处执行了其赋值,因此在执行Answer
函数时,c0
包含来自线程1。
将问题分解为线程时,请注意不要将两个线程写入同一位置,或者读取另一个线程可能写入的线程。这是避免竞争条件的最简单方法。
如果您想改变使用全局变量来传递结果,可以选择从包含线程代码的函数返回一个值。该函数必须返回void *
类型的值;实际上,无论您是否使用该值,这都是必要的,因此您的程序不正确(尽管它可能适用于许多计算机)。 pthread_join
的第二个参数(如果为非null)是指向将写入void*
值的位置的指针。请注意,void*
值在线程退出后需要保持有效:它可以是指向全局变量的指针,也可以是指向堆内存的指针(由malloc
分配的内存),但它不能是指向终止线程堆栈的指针。这是一个示例,其中函数返回堆上分配的内存块。
void *MC0(void *ignored) {
int *row = malloc(…);
…
return row;
}
int main() {
…
pthread_t thread1;
pthread_create(&thread1, NULL, MC0, NULL);
…
void *row1;
pthread_join(thread1, &row1);
…
free(row1);
}