多线程的生活游戏

时间:2016-10-28 12:11:08

标签: c multithreading conways-game-of-life

我一直在努力在c中实现多线程的生活游戏。程序从文件中读取一个大小为100x100的二维数组(A [100] [100]),将其复制到第二个数组(B [100] [100])并创建100个线程,这些线程分配了10x10的数组并且线程应该检查每个单元的邻居(来自数组A)并根据规则更改它的状态,在数组B中,当它们完成主函数时将B复制到A并从开始时开始聚合直到用户停止程序。我的问题是线程只改变数组最后一部分的值(位置[90-99] [90-99])。有没有人知道可能会出错?(如果我使用相同的代码,但将整个数组分配给所有线程,输出是正确的,如果我只使用一个线程就会发生同样的事情)

2 个答案:

答案 0 :(得分:2)

下面:

int c[5];
for(i=0;i<100;i=i+10){
    for(j=0;j<100;j=j+10){
        c[0]=i;
        c[1]=i+9;
        c[2]=j;
        c[3]=j+9;
        c[4]=k;
        err = pthread_create(&(tid[k++]),NULL, &populate, (void *)c);
    }
}

您将相同的数组传递给每个线程。所以所有线程都有相同的参数 - 无论c的最终值是在循环的末尾。

相反,请为每个帖子提供自己的c

int *c;
for(i=0;i<100;i=i+10){
    for(j=0;j<100;j=j+10){
        c = malloc(5 * sizeof(*c));
        c[0]=i;
        c[1]=i+9;
        c[2]=j;
        c[3]=j+9;
        c[4]=k;
        err = pthread_create(&(tid[k++]),NULL, &populate, (void *)c);
    }
}

答案 1 :(得分:0)

你的“has_neighbors”作为一大堆冗余代码,可以通过将范围检查与内容检查相结合来删除,

    ...
        if( i> 0 && j> 0 && A[i-1][j-1]==1) count++;
        if( i> 0         && A[i-1][j  ]==1) count++;
        if( i> 0 && j<99 && A[i-1][j+1]==1) count++;
        if(         j> 0 && A[i  ][j-1]==1) count++;
        if(         j<99 && A[i  ][j+1]==1) count++;
        if( i<99 && j> 0 && A[i+1][j-1]==1) count++;
        if( i<99         && A[i+1][j  ]==1) count++;
        if( i<99 && j<99 && A[i+1][j+1]==1) count++;
        return count;
    }

或使用范围检查子函数返回内容:

int neighbour_value(int i, int j){
    if (i<0 || i>99) return 0;     /* out of range, never set */
    if (j<0 || j>99) return 0;     /* out of range, never set */
    return A[i,j];
}

然后只需检查

{
    int count = 0;
    if(neighbour_value(i-1,j-1)==1) count++;
    if(neighbour_value(i-1,j  )==1) count++;
    if(neighbour_value(i-1,j+1)==1) count++;
    if(neighbour_value(i  ,j-1)==1) count++;
    if(neighbour_value(i  ,j+1)==1) count++;
    if(neighbour_value(i+1,j-1)==1) count++;
    if(neighbour_value(i+1,j  )==1) count++;
    if(neighbour_value(i+1,j-1)==1) count++;

    return count;
}
相关问题