我尝试将一个由 1 到 100 之间的 10 个数字组成的数组抛给 pthread 以查找最小值、最大值和平均值。
我在抛出之前打印数组的值。
这些值具有正确的值。
但有时它有错误的阀门,如 -209574485
或 65271552
。
只有当数组被抛给 pthread 时,错误的值才会出现。
我的代码如下:
#define N 3
#define MAXSize 10
void *min_thread(void *arg)
{
int *test = (int*)arg;
int min;
for (int i = 1; i <= MAXSize; i++) {
if (test[i] < min) {
min = test[i];
}
}
printf("Min number is : %d\n", min);
}
void *max_thread(void *arg)
{
int *test = (int*)arg;
int max;
for (int i = 1; i <= MAXSize; i++) {
if (test[i] > max) {
max = test[i];
}
}
printf("Max number is : %d\n", max);
}
void *Avg_thread(void *arg) {
int *test = (int*)arg;
int avg;
for (int i = 1; i <= MAXSize; i++) {
avg += test[i];
}
avg = avg / MAXSize;
printf("Avg number is : %d\n", avg);
}
int main(int argc, char *argv[])
{
srand(time(NULL));
int random_number[MAXSize];
int min, max, avg;
for (int i = 0; i < MAXSize; i++) {
random_number[i] = rand() % 100 + 1;
printf("%d\n", random_number[i]);
}
pthread_t my_thread[N];
pthread_create(&my_thread[1], NULL, min_thread, (void*)&random_number);
pthread_create(&my_thread[2], NULL, max_thread, (void*)&random_number);
pthread_create(&my_thread[3], NULL, Avg_thread, (void*)&random_number);
pthread_exit(NULL);
return 0;
}
我从这段代码得到的结果:
93
52
72
79
37
96
26
15
86
42
Min number is : -963189760
Avg number is : -96318925
Max number is : 96
最佳答案
问题是您刚刚创建了 3 个线程,但您的索引超出了限制。请注意,如果您定义了 int random_number[10];,那么您可以访问的最后一个元素是 random_number[9]
这同样适用于您的 min_thread() max_thread() Avg_thread() 函数。在这些函数的每一个中,你的 for 循环都是从 1 到 10(第十个元素不存在),换句话说,你想要访问数组中不存在的东西。 所以改变
for (int i=1; i<= MAXSize ; i++)
到
for (int i=0; i< MAXSize ; i++)
和
pthread_create(&my_thread[1], NULL, min_thread, (void*)&random_number);
pthread_create(&my_thread[2], NULL, max_thread, (void*)&random_number);
pthread_create(&my_thread[3], NULL, Avg_thread, (void*)&random_number);
到
pthread_create(&my_thread[0], NULL, min_thread (void*)&random_number);
pthread_create(&my_thread[1], NULL, max_thread, (void*)&random_number);
pthread_create(&my_thread[2], NULL, Avg_thread, (void*)&random_number);
正如 Chirag Acharya 所建议的,您还应该在函数内部初始化 min、max 和 avg 局部变量。如果不这样做,您可能会遇到未定义的行为。
您应该查看以下链接 Accessing an array out of bounds gives no error, why?了解更多详情。
关于c - 当我将数组扔给 pthread 时我得到了错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56078435/