数字验证器在C中使用线程导致分段错误

时间:2015-03-30 01:12:02

标签: c multithreading segmentation-fault sudoku

我正在使用C中的Sudoku验证器,它使用线程检查行是否有效,另一个线程检查列,以及9个线程来检查每个方块。当我尝试运行我的代码时,我遇到了分段错误(核心转储)。

我将sudoku作为每个线程访问的全局常量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");
}

我的值是2,因为我已经做了2个pthread_creates,一个用于行线程,一个用于列线程。

check squares是struct square的9元素数组,它有一个行值和一个列值。行是方形的起始行,列是方形的起始列。

线程函数squares_check的代码是

void *squares_check(void *check_squares)
{
    struct square *current_square = (struct square*)check_squares;

    int start_column = (*current_square).column;
    int start_row = (*current_square).row;
    int end_column = start_column + 3;
    int end_row = start_row + 3;
    int i, j;
    int values[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

    i = start_column;
    j = start_row;
    while (i < (end_column))
    {

        while (j < (end_row))
        {
            values[(sudoku[i][j])]++;
            j++;
        }
        j = start_row;
        i++;
    }

    if (values[1] != 1 || values[2] != 1 || values[3] != 1 || values[4] != 1 || values[5] != 1 || values[6] != 1 || values[7] != 1 || values[8] != 1 || values[9] != 1)
    {
        return (void *)1;
    }

    return (void *)0;
}

运行后的输出是

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)

如果代码的任何其他部分有帮助,或者如果您想查看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);

我的输出现在是:     制作主题 行检查已创建 列检查已创建 Square Check已创建 Square Check已创建 Square Check已创建 Square Check已创建 Square Check已创建 Square Check已创建 Square Check已创建 Square Check已创建 Square Check已创建 线程加入 线程加入 线程加入 分段错误(核心转储)

似乎错误发生在第3次连接之后,并且在第三次连接之后唯一改变的是它进入if循环。我假设我使用p_status(从线程函数返回)有一些问题

0 个答案:

没有答案