pthread_join на двух потоках с бесконечным циклом? - PullRequest
4 голосов
/ 31 октября 2011

Я только что прочитал здесь , что, когда основной цикл заканчивается, все потоки, которые имели или не имели возможности порождаться, прекращаются.Поэтому мне нужно выполнить соединение в каждом потоке, чтобы дождаться его возврата.

Моя проблема в том, как мне написать программу, в которой я создаю 2 потока, которые работают в бесконечном цикле?Если я подожду, чтобы присоединиться к бесконечному потоку, у второго никогда не будет шанса быть созданным!

Ответы [ 2 ]

6 голосов
/ 31 октября 2011

Вы можете сделать это с помощью следующей последовательности:

pthread_create thread1
pthread_create thread2
pthread_join thread1
pthread_join thread2

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

#include <stdio.h>
#include <pthread.h>

void *myFunc (void *id) {
    printf ("thread %p\n", id);
    return id;
}

int main (void) {
    pthread_t tid[3];
    int tididx;
    void *retval;

    // Try for all threads, accept less.

    for (tididx = 0; tididx < sizeof(tid) / sizeof(*tid); tididx++)
        if (pthread_create (&tid[tididx], NULL, &myFunc, &tid[tididx]) != 0)
            break;

    // Not starting any is pretty serious.

    if (tididx == 0)
        return -1;

    // Join to all threads that were created.

    while (tididx > 0) {
        pthread_join (tid[--tididx], &retval);
        printf ("main %p\n", retval);
    }

    return 0;
}

Это попытается запустить три потока перед тем, как присоединиться к любому, а затем присоединится ко всем тем, что ему удалось запустить,в обратном порядке.Выход, как и ожидалось, составляет:

thread 0x28cce4
thread 0x28cce8
thread 0x28ccec
main 0x28ccec
main 0x28cce8
main 0x28cce4
2 голосов
/ 31 октября 2011

Два основных варианта использования pthread_join - это (1) удобный способ блокировки до завершения созданного потока; (2) вы действительно заинтересованы в результате, возвращенном из созданного потока в pthread_join.

Если у вас больше нет работы для main, и вы просто блокируете, чтобы предотвратить завершение всего процесса, вы можете выйти из main с помощью pthread_exit. Main выйдет, но порожденные потоки продолжатся.

Если вы все равно не заинтересованы в коде возврата, вы можете так же легко создать потоки, как отсоединенные и pthread_exit main.

Наличие "бесконечного" цикла в созданных потоках - не лучшая практика. Как правило, вы хотите дать возможность потоку отключиться. Внутри потока это может быть условие eof, закрытое гнездо или что-то еще. Обычно вы хотите дать возможность потоку полностью отключаться от одного или нескольких других внешних потоков. Проверка на наличие переключателя внутри бесконечного цикла и аналогичные методы - самый простой способ сделать это. В противном случае вам придется идти по маршруту pthread_cancel, ловить сигналы и т. Д. Все немного сложнее.

...