pthread_join не ждет завершения потоков

Я использую pthreads.h в Windows для простого трассировщика лучей. Похоже, что основная функция не ждет завершения потоков. Когда я просто запускаю такую программу (теперь я упростил ее, чтобы просто протестировать потоки, но она все равно выдает ошибку):

typedef struct {
    unsigned int id; 
} Thread_Data;

void* render_band(void* arg) {
    Thread_Data* data = (Thread_Data*)arg;
    printf("This is thread number %d", data->id);
    pthread_exit(0);
}

int main() {
    pthread_t threads[NUM_THREADS];
    Thread_Data data[NUM_THREADS];
    for (int i = 0; i < NUM_THREADS; i++) {
        data[i].id = id;

        int rc = pthread_create(&threads[i], NULL, render_band, &data[i]);
        if (rc) {
            printf("[ERROR] From pthread_create: %d\n", rc);
        }
    } 

    for (int i = 0; i < NUM_THREADS; i++) {
        int rc = pthread_join(threads[i], NULL);
        if (rc) {
            printf("[ERROR] From pthread_join: %d\n", rc);
        }
    }
}

Изображение не будет завершено и отображает только пару пикселей. Однако когда я добавляю сон, изображение заканчивается. Это заставляет меня поверить, что pthread_join не ждет, даже если об этом говорится в документации. Что мне здесь не хватает?

Изменить: добавлена проверка ошибок, он возвращает код ошибки 3 для pthread_join.

# pthreads pthreads-win32
Источник
  • 1
    Насколько велик NUM_THREADS ? И вы должны добавить проверку ошибок в вызовы pthread_create и pthread_join
  • 1
    Вам не хватает проверок ошибок при вызовах pthread_create() и pthread_join() , поэтому вы не знаете, что получается, а что нет. Может ли быть, что height / NUM_THREADS оценивается как 0 (маленькое изображение, много потоков), поэтому потокам нечего делать? Распечатайте детали того, что должен делать Thread_Data для каждого потока - чтобы убедиться, что он делает то, что вы хотите. Я думаю, есть большая вероятность, что вам не хватает большого количества пикселей из-за min_y и max_y .
  • 0
    NUM_THREADS был протестирован с 1 и 8, оба не дали результата, а min_y и max_y дали ожидаемый результат. Добавлю сейчас проверку ошибок.
  • 1
    См. Stackoverflow.com/questions/44050496/pthread-join-error-code-3 . Кажется, что нить, к которой вы пытаетесь присоединиться, перестала существовать в момент присоединения? Как выглядит ваш render_band ?
  • 1
    Вам, вероятно, следует вывести значение i когда вы получите ошибку. Это первый поток (индекс 0), который терпит неудачу? Если это так, то есть хотя бы некоторая вероятность, что ваша функция потока, render_band() , обращается к &data[i] таким образом, чтобы писать поверх pthread_t threads[NUM_THREADS]; array, тем самым снижая ваши шансы получить что-нибудь полезное от pthread_join() . Вы получаете одну или несколько ошибок?
  • 0
    согласно странице pthread_join , возвращаемое значение 3 ( ESRCH ) означает, что «поток с идентификатором потока не может быть найден», что говорит о том, что структура данных вашего потока каким-то образом повреждена. Укажите MCVE, проблема не в показанном коде.
  • 0
    Код, который вы показываете, выглядит нормально. Таким образом, проблема должна заключаться в коде, который вы не показываете.
  • 0
    Каждый поток возвращает код ошибки три.
  • 0
    Я упростил код, но все равно выдает ту же ошибку. Он выполняет всю printf () с ожидаемыми данными-> id.
  • 1
    data[i].id = id; в опубликованном коде не похоже, что он должен компилироваться, поскольку id нигде не определен. Возможно, вы data[i].id = i; ?
  • 0
    Чтобы избежать таких ошибок, как отсутствие id , перед размещением здесь необходимо извлечь минимально воспроизводимый пример. Как новый пользователь, прочтите также Как задать вопрос и пройдите экскурсию .
Codelisting
за 0 против
Лучший ответ

Мне очень жаль, что я зря потратил время. Проблема заключалась в самой библиотеке. Когда я искал pthreads.h в Windows, я нашел некоторую библиотеку на sourceforge. Но, видимо, у MinGW уже была поддержка pthread, и это все испортило. Поэтому для людей с той же проблемой просто используйте тот, который поставляется с MinGW.

Codelisting
Популярные категории
На заметку программисту