Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 Mandelbrot使用Pthreads,单步遍历数组_C_Arrays_Multithreading_Pthreads_Mandelbrot - Fatal编程技术网

C Mandelbrot使用Pthreads,单步遍历数组

C Mandelbrot使用Pthreads,单步遍历数组,c,arrays,multithreading,pthreads,mandelbrot,C,Arrays,Multithreading,Pthreads,Mandelbrot,我正在做一个项目,用pthreads重写一个顺序C代码算法,将mandelbrot集合创建成一个并行集合。可以说,我遇到了一堵墙,因为我的版本只是输出了一张或多或少的黑色图片(与原始程序的结果没有任何关系),我真的看不出哪里出了问题。简单地说,我可以用第二双眼睛来观察这个 以下是重要的顺序代码段: void mandelbrot(float width, float height, unsigned int *pixmap) { int i, j; float xmin = -1.6f; flo

我正在做一个项目,用pthreads重写一个顺序C代码算法,将mandelbrot集合创建成一个并行集合。可以说,我遇到了一堵墙,因为我的版本只是输出了一张或多或少的黑色图片(与原始程序的结果没有任何关系),我真的看不出哪里出了问题。简单地说,我可以用第二双眼睛来观察这个

以下是重要的顺序代码段:

void mandelbrot(float width, float height, unsigned int *pixmap)
{
int i, j;
float xmin = -1.6f;
float xmax = 1.6f;
float ymin = -1.6f;
float ymax = 1.6f;
for (i = 0; i < height; i++) {
    for (j = 0; j < width; j++) {
        float b = xmin + j * (xmax - xmin) / width;
        float a = ymin + i * (ymax - ymin) / height;
        float sx = 0.0f;
        float sy = 0.0f;
        int ii = 0;
        while (sx + sy <= 64.0f) {
            float xn = sx * sx - sy * sy + b;
            float yn = 2 * sx * sy + a;
            sx = xn;
            sy = yn;
            ii++;
            if (ii == 1500) {
                break;
            }
        }
        if (ii == 1500) {
            pixmap[j+i*(int)width] = 0;
        }
        else {
            int c = (int)((ii / 32.0f) * 256.0f);
            pixmap[j + i *(int)width] = pal[c%256];
        }
    }
}


}
void mandelbrot(浮点宽度、浮点高度、无符号整数*pixmap)
{
int i,j;
浮点数xmin=-1.6f;
浮动xmax=1.6f;
浮动ymin=-1.6f;
浮动ymax=1.6f;
对于(i=0;i而(sx+sy我在发布此代码后不久就找到了答案。我真傻

不管怎么说,问题不是在函数中单步遍历数组,而是我如何创建线程

这是问题发生时的主要情况:

for(int k = 0; k < 1024; k++) {
    pthread_create(&threads[k], NULL, (void*)Mandel, (void*) k);
}
for(int k=0;k<1024;k++){
pthread_创建(&threads[k],NULL,(void*)Mandel,(void*)k);
}
这样做的问题是循环继续,为下一个线程更改了k的值,这意味着我们刚刚创建的最后一个线程突然得到了一个错误的k值。这是通过使用int数组解决的,该数组在我们遍历每个k值并创建每个线程时保存k的值,如下所示:

int id[1024];
for(int k = 0; k < 1024; k++) {
    pthread_create(&threads[k], NULL, (void*)Mandel, (void*)(id+k));
}
int-id[1024];
对于(int k=0;k<1024;k++){
pthread_创建(&threads[k],NULL,(void*)Mandel,(void*)(id+k));
}
我想指出以下链接中的帖子,帮助我回答这个问题:


这表明,如果搜索足够长的时间,在大多数情况下,您都可以找到您想要的答案。

启动线程时,您如何传入threadId?因为您似乎在使用指针,所以在调用pthread_create()后,需要保留实际值。例如,如果您使用相同的变量,并在创建每个线程后仅对其进行增量,则各个线程可能无法获得正确的值,因为threadId所指向的位置在读入值之前已发生更改…我已自己解决了此问题,我将发布更新答案。但是,是的,您确实在去那里:P
int id[1024];
for(int k = 0; k < 1024; k++) {
    pthread_create(&threads[k], NULL, (void*)Mandel, (void*)(id+k));
}