C 第二个pthread不会进入第二个循环

C 第二个pthread不会进入第二个循环,c,pthreads,max,C,Pthreads,Max,我的线程有问题。我试图在二维数组中找到主对角线的最大元素。第一个pthread将完成它的工作并找到max元素。但是,当第二和第三等阵型入党时,他们将不会进入第二阵型。我的函数如下所示: void* findMax() { //int t = 1; //*arr.times = 0; for (*arr.countI = 0; *arr.countI < *arr.l; (*arr.countI)++) { for (*arr.countJ = 0

我的线程有问题。我试图在二维数组中找到主对角线的最大元素。第一个pthread将完成它的工作并找到max元素。但是,当第二和第三等阵型入党时,他们将不会进入第二阵型。我的函数如下所示:

void* findMax() {
    //int t = 1;

    //*arr.times = 0;

    for (*arr.countI = 0; *arr.countI < *arr.l; (*arr.countI)++) {
        for (*arr.countJ = 0; *arr.countJ < *arr.l; (*arr.countJ)++) {
            printf("%d ", arr.a[*arr.countI][*arr.countJ]);
            if (*arr.l - *arr.countJ == 1)
                printf("\n");
        }
    }

    *arr.countI = 0;
    *arr.countJ = 0;

    while (*arr.countI != *arr.l) {
        while (*arr.countJ != *arr.l) {
            if (*arr.countI == *arr.countJ) {
                if (abs(arr.a[*arr.countI][*arr.countJ]) > *arr.max)
                    *arr.max = abs(arr.a[*arr.countI][*arr.countJ]);
            }

            ++(*arr.countJ);
        }

        ++(*arr.countI);

        /*if (++(*arr.times) == 1) {
            *arr.times = 0;
            break;
        }*/
    }

    printf("max = %d\n", *arr.max);
}
void *findMax(void *arg)
{
    assert(arg == 0);

    for (int i = 0; i < *arr.l; i++) {
        for (int j = 0; j < *arr.l; j++) {
            printf("%d ", arr.a[i][j]);
        }
        printf("\n");
    }

    int max = abs(arr.a[0][0]);
    for (int i = 1; i < *arr.l; i++)
    {
        int absval = abs(arr.a[i][i]);
        if (absval > max)
            max = absval;
    }

    if (pthread_mutex_lock(arr.mtx) == 0)
    {
        *arr.max = max;
        pthread_mutex_unlock(arr.mtx);
    }

    printf("max = %d\n", *arr.max);
    return 0;
}
最大值等于4,这当然不对

arr是一个结构全局,拥有我所需要的一切;arr.a是数组


在过去的几天里,我把它弄得一团糟,但是运气不好…

正如前面的评论中所指出的,您没有互斥性,因此您的线程都在忙于操作全局数组的元素,而不考虑其他线程在做什么

所有这些参考资料都很难看。互斥性在哪里确保没有线程在修改arr内部的任何内容,而另一个线程也在修改它?您有*arr.countI=0;,例如,但没有明显的相互排斥。您有*arr.max=absarr.a[*arr.countI][*arr.countJ];没有相互排斥。您有+++*arr.countJ;没有相互排斥。没有一条线索知道发生了什么。也许你很幸运,*arr.countI==*arr.l,这样他们就不会进入循环。但是您没有并发控制,所以一切都是猜测


我认为您应该停止从全局数据中使用countI和countJ,并且在大多数情况下使用arr.max。这些应该被每个线程的局部变量inti替换;int j;int max;。如果你沿着主对角线向下扫描,你不需要嵌套的循环——你只需要沿着对角线向下走。对于一项非常简单的工作,您的代码非常复杂。您仍然需要一个互斥体来允许可靠地设置*arr.max。arr.a和*arr.l是“OK”,但为什么*arr.l是指针?因为你不会修改它们。你答应归还一个空白,什么也不归还。对编译器撒谎是个坏主意™.

如果线程将任何内容存储到全局结构arr中,则需要确保存在互斥。我假设您拥有或添加了一个成员mtx,它是指向pthread_mutex_t的指针,pthread_mutex_t是在调用线程函数之前初始化的。我还假设findMax函数是从pthread_create调用的,并作为函数指针传递给它

您可以使用更简单的代码来完成此任务,如下所示:

void* findMax() {
    //int t = 1;

    //*arr.times = 0;

    for (*arr.countI = 0; *arr.countI < *arr.l; (*arr.countI)++) {
        for (*arr.countJ = 0; *arr.countJ < *arr.l; (*arr.countJ)++) {
            printf("%d ", arr.a[*arr.countI][*arr.countJ]);
            if (*arr.l - *arr.countJ == 1)
                printf("\n");
        }
    }

    *arr.countI = 0;
    *arr.countJ = 0;

    while (*arr.countI != *arr.l) {
        while (*arr.countJ != *arr.l) {
            if (*arr.countI == *arr.countJ) {
                if (abs(arr.a[*arr.countI][*arr.countJ]) > *arr.max)
                    *arr.max = abs(arr.a[*arr.countI][*arr.countJ]);
            }

            ++(*arr.countJ);
        }

        ++(*arr.countI);

        /*if (++(*arr.times) == 1) {
            *arr.times = 0;
            break;
        }*/
    }

    printf("max = %d\n", *arr.max);
}
void *findMax(void *arg)
{
    assert(arg == 0);

    for (int i = 0; i < *arr.l; i++) {
        for (int j = 0; j < *arr.l; j++) {
            printf("%d ", arr.a[i][j]);
        }
        printf("\n");
    }

    int max = abs(arr.a[0][0]);
    for (int i = 1; i < *arr.l; i++)
    {
        int absval = abs(arr.a[i][i]);
        if (absval > max)
            max = absval;
    }

    if (pthread_mutex_lock(arr.mtx) == 0)
    {
        *arr.max = max;
        pthread_mutex_unlock(arr.mtx);
    }

    printf("max = %d\n", *arr.max);
    return 0;
}

警告:未编译的代码

所有这些参考资料都很难看。互斥性在哪里确保没有线程在修改arr内部的任何内容,而另一个线程也在修改它?您有*arr.countI=0;例如,但没有明显的相互排斥。您有*arr.max=absarr.a[*arr.countI][*arr.countJ];没有相互排斥。您有+++*arr.countJ;没有相互排斥。没有一条线索知道发生了什么。也许你很幸运,*arr.countI==*arr.l,这样他们就不会进入循环。但是您没有并发控制,所以一切都是猜测。我认为您应该停止使用全局数据中的countI和countJ,并且在大多数情况下使用arr.max。这些应该被每个线程的局部变量inti替换;int j;int max;。如果你沿着主对角线向下扫描,你不需要嵌套的循环——你只需要沿着对角线向下走。对于一项非常简单的工作,您的代码非常复杂。您仍然需要一个互斥体来允许可靠地设置*arr.max。arr.a和*arr.l“正常”为什么*arr.l是指针?因为你不会修改它们。你答应归还一个空白,什么也不归还。对编译器撒谎是个坏主意。如果pthread_create调用此函数,则它缺少输入参数。thread函数被传递一个void*参数,它可能会也可能不会真正使用它。