Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言中的多线程生活游戏_C_Multithreading_Conways Game Of Life - Fatal编程技术网

c语言中的多线程生活游戏

c语言中的多线程生活游戏,c,multithreading,conways-game-of-life,C,Multithreading,Conways Game Of Life,我一直在尝试用c实现一个多线程的生活游戏。程序从文件中读取一个大小为100x100的2d数组(a[100][100]),将其复制到第二个数组(B[100][100]),并创建100个线程,这些线程被分配到数组的10x10部分,这些线程应该检查每个单元的邻居(来自数组a),并根据数组B中的规则更改其状态,当它们完成时,主功能将B复制到A中,并从Begging开始aggain,直到用户停止程序。我的问题是线程只更改数组最后部分的值(位置[90-99][90-99])。有人知道可能会出错吗?(如果我使

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

这里:

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);
    }
}
您的“has_neighbories”是一大堆冗余代码,可以通过结合范围检查和内容检查来删除这些代码

    ...
        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;
    }

与您的问题无关:但明智的做法是不要使用
100
99
等常量,而是
BOARDSIZE
BOARDSIZE-1
。这使您可以在一个位置更改boardsize,您的代码将更具可读性。您是否尝试过一些基本调试???????当你尝试写入/读取内存时,你看到内存内部发生了什么吗?如果你只是将前提条件添加到if中,80%的人不需要“检查邻居”。e、 g.A[i][j-1]仅在j>0时计数,因此,如果(j>0&&A[i][j-1]),请写入
if(j>0&&A[i][j-1])
,然后只写入一次。只有最后一个else块才是真正需要的,然后(添加了先决条件)YW。另外,当数组不再使用时,不要忘记
free()
    ...
        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;
}