у меня неправильное значение, когда я бросаю массив в pthread - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь выбросить массив из 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

1 Ответ

2 голосов
/ 10 мая 2019

Проблема в том, что вы только что создали 3 потока, но ваши индексы выходят за пределы. Обратите внимание, что если вы определите int random_number [10]; , то последний доступный элемент будет random_number [9]

То же самое относится к вашим функциям min_thread () max_thread () Avg_thread (). В каждой из этих функций ваш цикл for имеет значение от 1 до 10 (десятый элемент не существует), другими словами, вы хотите получить доступ к чему-то, чего нет в массиве. Так что изменить

для (int i = 1; i <= MAXSize; i ++) </p>

до

для (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);

Как предложил Чираг Ачарья, вы также должны инициализировать локальные переменные min, max и avg внутри функций. Если вы этого не сделаете, вы можете получить неопределенное поведение.

Вам следует взглянуть на следующую ссылку Доступ к массиву вне границ не дает ошибок, почему? для получения более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...