Ошибка при возврате нескольких значений в потоки в C - PullRequest
2 голосов
/ 22 января 2020

Я настроил несколько потоков, каждый из которых будет заполнен несколькими значениями, и он должен сделать запрос к БД и вернуть несколько значений.

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

Основная функция:

for(int i=0; i<n; i++){
    struct thread_args* args = malloc(sizeof(*args));
    args->str = str;
    args->tri_input = tri_input;
    args->length = length;
    res = pthread_create(&t_id[i], NULL, threads, args);
    if(res != 0)
        printf("Failed to create %d th thread.\n", i);
}

for(int i=0; i<n; i++){
    void *returnRes;
    pthread_join(t_id[i], &returnRes);
    indicesArr[i] = returnRes;
    printf("in main thread, indicesArr[%d].length: %d\n", i, indicesArr[i] -> length);
}

Одиночный поток:

void *threads(void *args_){

    struct thread_args *args = (struct thread_args *)args_;
    char* str = args -> str;
    struct IntArrLenArr* indicesArr = NULL;
    indicesArr = malloc(sizeof(*indicesArr));
    int length = args -> length;
    PGconn *dbconn = DBconnect(str);
    *indicesArr = duncitonReturnIndicesArr(dbconn);
    printf("in threads, indicesArr -> length: %d\n", indicesArr->length);
    free(args);
    PQfinish(dbconn);
    return indicesArr;
}

Результат был следующим:

in threads, indicesArr -> length: 0
in threads, indicesArr -> length: 0
in threads, indicesArr -> length: 4
in threads, indicesArr -> length: 0
in threads, indicesArr -> length: 0
in threads, indicesArr -> length: 4
in threads, indicesArr -> length: 4
in threads, indicesArr -> length: 0
in main threads, indicesArr[0].length: -1949512500
in threads, indicesArr -> length: 2
in threads, indicesArr -> length: 4
in threads, indicesArr -> length: 4
in threads, indicesArr -> length: 1
in threads, indicesArr -> length: 4

Process returned -1073741819 (0xC0000005)   execution time : 6.551 s
Press any key to continue.

Кажется хорошо работает, если он скомпилирован mingw64 на win10, но мне как-то приходится компилировать его в 32-битной версии. Моя IDE - это Codeblocks, отличается от mingw64, мне пришлось добавить там компоновщик MinGW\lib\libpthread_s.dll.a и MinGW\lib\libpthread.a, когда я скомпилировал его с помощью mingw32. Я не знаю, может ли это быть проблемой? и как я мог это исправить?

Ответы [ 2 ]

0 голосов
/ 23 января 2020

То, как я возвращаю значения, на самом деле не было проблемой. Это было проблемой в библиотеках, которые я использовал. Поэтому я использую менеджер установки Mingw (который должен быть установлен по умолчанию) для переустановки библиотек min3gw2-libpthread.... и это сработало.

0 голосов
/ 22 января 2020

Вы должны быть более осторожны с использованием pthread_join():

  • . Прежде чем использовать возвращаемое значение, вам необходимо проверить, успешно ли выполнена функция. В противном случае возвращаемое значение будет не таким, как вы ожидаете.
  • , вам также следует инициализировать указатель для значения возврата.
...