Мой код C не работает, но работает другой пример, похожий на меня. Почему? - PullRequest
0 голосов
/ 25 апреля 2020

Мой код не работает ... Но работает другой пример, похожий на мой код. Как я могу исправить?

Кажется, что pthread_join() внутренне изменить целочисленное значение, как мой код. Но у меня не работает.

Кто-нибудь может мне помочь исправить?

#include <stdio.h>

void test(void **temp) {
    int foo = 3;
    *temp = foo;
}

int main(void) {
    int temp;

    test((void **)&temp);
    printf("%d\n", temp);

    return 0;
}

pthread_join пример:

#include <pthread.h>
#include <stdlib.h>

void *test(void *data) {
    int i;
    int a = *(int *)data;
    for (i = 0; i < 10; i++) {
        printf("%d\n", i * a);
    }
}

int main() {
    int a = 100;
    pthread_t thread_t;
    int status;

    if (pthread_create(&thread_t, NULL, test, (void *)&a) < 0) {
        perror("thread create error:");
        exit(0);
    }

    pthread_join(thread_t, (void **)&status);
    printf("Thread End %d\n", status);
    return 1;
}

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Но мой не работает ..

Этот оператор:

pthread_join(thread_t, (void **)&status);

присваивает статусу return значение вашей функции потока , Но ваша функция не возвращает что-либо , поэтому вы получаете мусор.

Чтобы исправить это, заставьте вашу функцию test вернуть что-то.

PS Пожалуйста, включите предупреждения компилятора (-Wall, -Wextra) - компилятор уже должен был предупредить вас об ошибке.

PPS Пожалуйста, не называйте свои переменные следующим образом: thread_t - _t стоит для тип , а thead_t - это , а не тип.

0 голосов
/ 25 апреля 2020

Вы пытаетесь преобразовать temp в два пустых указателя (void **), когда у вас есть только один указатель на int temp. Просто верните значение указателя, и вы можете использовать его в похожем примере.

#include <stdio.h>
#include <stdlib.h>

void *test(void *temp) {
    int *ptr = (int*)malloc(sizeof(int));
    *ptr = 3;
    return ptr;
}

int main(int argc, char *argv[]) {
    int *temp = (int*)test(nullptr);
    printf("%d\n", *temp);
    free(temp);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...