pthread - как запустить новый поток без вызова join? - PullRequest
13 голосов
/ 31 мая 2011

Я хочу начать новую тему с основной темы. Я не могу использовать соединение, так как не хочу ждать завершения потока, а затем возобновить выполнение.
По сути, мне нужно что-то вроде pthread_start (...), но я не могу его найти.

Edit:
Поскольку все предложенные ответы должны начинать работу с create_thread, проблема в том, что в приведенном ниже простом коде он не работает. Вывод программы ниже - «основной поток». Похоже, что дополнительный поток никогда не выполняется. Есть идеи, где я не прав?
скомпилирован и запущен на Fedora 14 GCC версии 4.5.1

void *thread_proc(void* x)
{
   printf ("sub thread.\n");
   pthread_exit(NULL);
}


int main()
{
    pthread_t t1;
    int res = pthread_create(&t1, NULL, thread_proc, NULL);
    if (res)
    {
        printf ("error %d\n", res);
    }

    printf("main thread\n");
    return 0;
}

Ответы [ 7 ]

18 голосов
/ 31 мая 2011

Функция для запуска потока pthread_create, а не pthread_join. Вы используете pthread_join только тогда, когда готовы ждать, и ресинхронизировать, и если вы отсоедините поток, нет необходимости использовать это вообще. Вы также можете присоединиться к другой теме.

Перед выходом (позвонив по номеру exit или вернувшись из main) Вы должны убедиться, что другой поток не запущен. В одну сторону (но не единственное), чтобы сделать это, присоединившись ко всем темам, которые вы создано.

6 голосов
/ 31 мая 2011

поведение вашего кода зависит от планировщика;вероятно, основная программа завершает работу до того, как printf в созданном потоке будет выполнен.Я надеюсь, что простой сон (some_seconds) в конце main () вызовет вывод потока:)

3 голосов
/ 31 мая 2011

вызов join ожидает завершения и завершения потока.

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

2 голосов
/ 31 мая 2011

Просто создайте поток с установленным атрибутом detached. Для этого вы можете либо вызвать pthread_detach после создания потока, либо pthread_attr_setdetachstate до его создания.

Когда поток отсоединяется, родительский поток не должен ждать его и не может получить возвращаемое значение.

1 голос
/ 14 августа 2011

вам нужно вызвать pthread_exit в конце man (), что заставит main ждать запуска и завершения другого потока.Или вы можете явно вызвать pthread_join для ожидания вновь созданного потока

В противном случае, когда main вернется, процесс будет завершен, а все созданные им потоки будут уничтожены.

0 голосов
/ 31 мая 2011

Разве вам не нужно просто позвонить pthread_create ?

static void *thread_body(void *argument) { /* ... */ }

int main(void) {
    pthread_t thread;
    pthread_create(&thread, NULL, thread_body, NULL);
    /* ... */
0 голосов
/ 31 мая 2011

Поток запускается автоматически, когда вы создаете его.

...