Pthreads程序有时会产生错误的输出和正确的输出

时间:2015-11-02 00:53:47

标签: c ubuntu pthreads

我正在学习使用Pthreads进行并行编程。我试着写下面这个简单的程序。它从stdin中获取两个向量(用户将长度指定为命令行参数)然后添加它们,减去它们,将它们按元素相乘并通过为四个操作创建一个线程来逐元素地划分它们。问题是有时代码工作正常,当我再次使用相同的输入时,它只会打印零。

为什么它会像这样?

我在虚拟机上使用Ubuntu 14.04。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define loop(i, n) for (i = 0; i < n; i++)

int thread_count, n;
int *a;
int *b;
int** results; // holds the four output vectors
void* math(void* opl);


int main(int argc, char* argv[]){
    int thread = 0, i;
    pthread_t* thread_handles;

    n = strtol(argv[1], NULL, 10);

    results = malloc(4 * sizeof(int*));
    a = malloc(n * sizeof(int));
    b = malloc(n * sizeof(int));

    loop(i, n)
        scanf("%d", a + i);

    loop(i, n)
        scanf("%d", b + i);

    thread_handles = malloc(4*sizeof(pthread_t));

    loop(thread, 4){
        results[thread] = malloc(n * sizeof(int));
        pthread_create(&thread_handles[thread], NULL, math, (void *)thread);
    }

    printf("Hello from the main thread\n");

    loop(thread, 4);
        pthread_join(thread_handles[thread], NULL);

    loop(thread, 4){
        printf("Results of operation %d:\n", thread); 
        loop(i, n)
            printf("%d ", results[thread][i]);
        printf("\n");
       free(results[thread]);
    }

    free(thread_handles);
    free(a);
    free(b);
    free(results);

   return 0;    
}

void* math(void* op1){
    int op = (int) op1, i;

    printf("%d ", op);
    if (op == 0)
        loop(i, n)
             results[op][i] = a[i] + b[i];
    else if (op == 1)
         loop(i, n)
             results[op][i] = a[i] - b[i];
    else if (op == 2)
         loop(i, n)
             results[op][i] = a[i] * b[i];
    else
        loop(i, n)
            results[op][i] = a[i] / b[i];



    return NULL;
}

1 个答案:

答案 0 :(得分:3)

这个问题是由你学到的神圣循环定义引起的。请忘掉它!

#define loop(i, n) for (i = 0; i < n; i++)

这是问题所在:

loop(thread, 4);
//             ^ BAD! Putting a semicolon here makes the loop empty.

使用您选择的糟糕定义的正确版本是:

loop(thread, 4)

更好的方法就是说出你的意思!

for(i=0; i<n; ++i)
{
   // Do Stuff
}

问题导致pthread_join被调用一次,然后主线程继续。这可能发生在所有线程完成之前,并在结果变量中提供它们的输出。不好!<​​/ p>