【问题标题】:i have wrong vlaue when i throw array to pthread当我将数组扔到 pthread 时,我的值错误
【发布时间】:2019-05-10 13:11:31
【问题描述】:

我尝试将一个包含 10 个数字的数组(从 1 到 100)扔到 pthread 以查找最小值、最大值和平均值。

我在抛出之前打印数组的值。
这些值具有正确的值。

但有时它有错误的阀门,例如 -20957448565271552
错误值仅在数组被抛出到 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

【问题讨论】:

  • 您的 minmaxavg 变量未初始化。也就是说if (test[i] &lt; min),if (test[i] &gt; max)肯定会导致输出不确定。
  • 数组从索引0 btw 开始。
  • 关于:for (int i = 1; i &lt;= MAXSize; i++) { 在 C 中,数组的有效索引是 0...(数组中的元素数 - 1)所以发布的代码正在访问数组末尾之外的垃圾(即未定义的行为)建议:for (int i = 0; i &lt; MAXSize; i++) {
  • 关于:pthread_exit(NULL); return 0; 第二条语句永远不会执行,因为第一条语句:pthread_exit() 已经退出函数
  • 关于:pthread_create(&amp;my_thread[1], NULL, min_thread, (void*)&amp;random_number); pthread_create(&amp;my_thread[2], NULL, max_thread, (void*)&amp;random_number); pthread_create(&amp;my_thread[3], NULL, Avg_thread, (void*)&amp;random_number); 第三次调用pthread_create() 具有未定义的行为,因为my_thread[] are: 0, 1,2 的唯一有效索引因此3 的访问超出了末尾数组

标签: c arrays pthreads


【解决方案1】:

问题是您刚刚创建了 3 个线程,但您的索引超出了限制。请注意,如果您定义 int random_number[10]; 那么您可以访问的最后一个元素是 random_number[9]

这同样适用于您的 min_thread() max_thread() Avg_thread() 函数。在这些函数中的每一个中,您的 for 循环都是从 1 到 10(第十个元素不存在),换句话说,您想要访问不在数组中的东西。 所以改变

for (int i=1; i

for (int i=0; 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? 了解更多详情。

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多