C中使用导致分段错误的线程的数独验证程序

C中使用导致分段错误的线程的数独验证程序,c,multithreading,segmentation-fault,sudoku,C,Multithreading,Segmentation Fault,Sudoku,我正在用C编写一个数独验证程序,它使用一个线程检查行是否有效,另一个线程检查列,9个线程检查每个方块。当我试图运行我的代码时,我得到了一个分段错误 我将数独作为每个线程访问的全局常量2D数组,我想知道这是否是问题所在 根据valgrind输出,它似乎与线程函数squares_check有问题,根据错误检查输出,它在到达第6个方形线程时停止工作,以创建总共11个线程中的第8个 它似乎遇到的代码块是: while (i < THREAD_AMOUNT) { if (pthread_cr

我正在用C编写一个数独验证程序,它使用一个线程检查行是否有效,另一个线程检查列,9个线程检查每个方块。当我试图运行我的代码时,我得到了一个分段错误

我将数独作为每个线程访问的全局常量2D数组,我想知道这是否是问题所在

根据valgrind输出,它似乎与线程函数squares_check有问题,根据错误检查输出,它在到达第6个方形线程时停止工作,以创建总共11个线程中的第8个

它似乎遇到的代码块是:

while (i < THREAD_AMOUNT)
{
    if (pthread_create(&thread_ids[i], NULL, squares_check, &check_squares[square_count]) > 0)
    {
        perror("ERROR: pthread_create for square");
        exit(1);
    }
    i++;
    square_count++;
    printf("Square Check created\n");
}
如果代码的任何其他部分有帮助,或者如果您希望看到Valgrind输出,请告诉我。提前感谢您的帮助

编辑

好的,感谢这些评论,我能够取得一些进展,现在所有的线程都可以创建了,没有问题。现在,在连接第三个线程后,我遇到了一个段错误。我加入线程的代码是

while (i < THREAD_AMOUNT)
{
    if (pthread_join(thread_ids[i], &p_status) != 0)
    {
        perror("ERROR: Joining threads");
        exit(1);
    }

    //Threads may still be building their return, so lock stdout
    if (pthread_mutex_lock(&output_lock) != 0)
    {
            perror("Could not lock output: ");
            exit(1);
    }

    if (i > 2)
    {
        valid[i] = *(int *)p_status;
    }

    if (pthread_mutex_unlock(&output_lock) != 0)
    {
            perror("Could not unlock output: ");
            return 5;
    }

    free(p_status);

    i++;
    printf("Thread Joined\n");  
}

i = 0;

if (valid[i++] == 1)
{
    printf("Rows aren't valid\n");
    is_valid = 1;
}

if (valid[i++] == 1)
{
    printf("Columns aren't valid\n");
}

square_count = 0;

while (i < THREAD_AMOUNT)
{
    if (valid[i++] == 1)
    {
        printf("The square starting at row: %d and column: %d is not valid.\n", check_squares[square_count].row, check_squares[square_count].column);
    }
    square_count++;
}

free(thread_ids);
我现在的输出是: 制线 行检查已创建 已创建列检查 方格检查已创建 方格检查已创建 方格检查已创建 方格检查已创建 方格检查已创建 方格检查已创建 方格检查已创建 方格检查已创建 方格检查已创建 螺纹连接 螺纹连接 螺纹连接 分段故障堆芯


错误似乎发生在第三次连接之后,第三次连接之后唯一的变化是它进入了if循环。我假设我如何使用p_状态存在一些问题。从线程函数返回到完整源的链接可能需要检测列/行环绕,end_column=start_column+3%9;并调整while循环以应对这种情况。IOWs数独[i][j]正在访问外部索引0-8。感谢chux,我尝试了您的解决方案,但它会扩大最后一个正方形的大小(位于位置6,6的正方形)的大小,使其不被检查,因为结束列值将低于实际值,但您会意识到我设置的实际值太高了。更改后,我能够到达连接线程的部分,但现在连接时出现了段故障。我将编辑原始帖子以匹配我的新问题。p_状态可能为null,因为您没有从线程中调用pthread_exit。此外,如果从i=0开始,则if条件应为ifi>=2,以>=;当我返回1时,我尝试用pthread_exits pthread_exitint*1替换线程中的返回值,当我返回0时,用pthread_exitint*0替换返回值,当我不想返回任何内容时,用pthread_exitNULL替换返回值,但我似乎仍然遇到相同的分段错误。
Making Threads
Row Check created
Columns Check created
Square Check created
Square Check created
Square Check created
Square Check created
Square Check created
Segmentation fault (core dumped)
while (i < THREAD_AMOUNT)
{
    if (pthread_join(thread_ids[i], &p_status) != 0)
    {
        perror("ERROR: Joining threads");
        exit(1);
    }

    //Threads may still be building their return, so lock stdout
    if (pthread_mutex_lock(&output_lock) != 0)
    {
            perror("Could not lock output: ");
            exit(1);
    }

    if (i > 2)
    {
        valid[i] = *(int *)p_status;
    }

    if (pthread_mutex_unlock(&output_lock) != 0)
    {
            perror("Could not unlock output: ");
            return 5;
    }

    free(p_status);

    i++;
    printf("Thread Joined\n");  
}

i = 0;

if (valid[i++] == 1)
{
    printf("Rows aren't valid\n");
    is_valid = 1;
}

if (valid[i++] == 1)
{
    printf("Columns aren't valid\n");
}

square_count = 0;

while (i < THREAD_AMOUNT)
{
    if (valid[i++] == 1)
    {
        printf("The square starting at row: %d and column: %d is not valid.\n", check_squares[square_count].row, check_squares[square_count].column);
    }
    square_count++;
}

free(thread_ids);