线程返回计算

时间:2015-03-03 19:36:37

标签: c multithreading

我试图通过使用线程来增加矩阵。我无法从线程返回值以显示在另一个函数中。

下面主要和第一个主题的示例代码。

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)进行显示。

1 个答案:

答案 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);
}