【发布时间】:2019-05-10 13:11:31
【问题描述】:
我尝试将一个包含 10 个数字的数组(从 1 到 100)扔到 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
【问题讨论】:
-
您的
min、max和avg变量未初始化。也就是说if (test[i] < min),if (test[i] > max)肯定会导致输出不确定。 -
数组从索引
0btw 开始。 -
关于:
for (int i = 1; i <= MAXSize; i++) {在 C 中,数组的有效索引是 0...(数组中的元素数 - 1)所以发布的代码正在访问数组末尾之外的垃圾(即未定义的行为)建议:for (int i = 0; i < MAXSize; i++) { -
关于:
pthread_exit(NULL); return 0;第二条语句永远不会执行,因为第一条语句:pthread_exit()已经退出函数 -
关于:
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[] are:0, 1,2 的唯一有效索引因此3的访问超出了末尾数组