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