【发布时间】:2021-07-03 18:23:02
【问题描述】:
#include <pthread.h>
#include <stdio.h>
#define WIDTH 1000
#define HEIGHT 1000
typedef struct s_pair
{
int x;
int y;
} t_pair;
char pixels[HEIGHT][WIDTH];
void *add_to_global(void *param)
{
t_pair *input;
input = (t_pair *)param;
if (!(input->x % 2))
pixels[input->y][input->x] = '.';
else if (!(input->x % 3))
pixels[input->y][input->x] = '#';
else
pixels[input->y][input->x] = ' ';
return (NULL);
}
void thread_runner(int x_start, int x_end, int y_start, int y_end)
{
pthread_t workers[10];
t_pair inputs[10];
int i, x, y;
y = y_start - 1;
while (++y < y_end)
{
x = x_start - 1;
i = -1;
while (x < x_end)
{
if (++i < 10)
{
inputs[i] = (t_pair){++x, y};
pthread_create(&workers[i], NULL, add_to_global, (void *)&inputs[i]);
}
else
while (--i > -1)
pthread_join(workers[i], NULL);
}
while (--i > -1)
pthread_join(workers[i], NULL);
printf("%s\n", pixels[y]); // if this is removed, this program will never finish
}
}
int main()
{
thread_runner(0, WIDTH, 0, HEIGHT);
return (0);
}
所以最初在尝试制作分形可视化器时遇到了这个问题,我可以使用这种一次运行十个线程的方法,前提是我在执行此操作时在屏幕上绘制图像。如果我让程序自行运行,它会变得完全没有响应,并且我的 mac 开始发出令人不安的噪音。我对线程还很陌生,所以这可能是我对它们的误解非常简单。
这个程序是我在不需要所有分形废话的情况下重现这种现象的尝试。这是一个完全没有意义的程序,它只是告诉你一个点的 x 坐标是否可以被 2 或 3 整除,并相应地将某些字符打印到终端。
如果您在处理完该行上的每个点 x 之后删除打印每一行 y 的 printf,程序将变得无响应。但是,使用这种定期打印运行程序可以使其正常工作。这似乎是一些编程恶魔在跟我开玩笑,让问题无法调试。
为什么这个问题被看似毫无意义的 printf 解决了?为什么我的 mac 在没有这个 printf 的情况下运行它时会发出令人不安的声音?
【问题讨论】:
-
如果编程恶魔似乎在和你开玩笑,那么很有可能你正在执行未定义的行为,例如超出数组的边界或在结束后尝试使用对象它的生命周期。
标签: c pthreads pthread-join