pthread_join在两个无限循环线程上?

时间:2011-10-31 05:52:26

标签: c pthreads posix

我刚读了here,当主循环结束时,任何有或没有机会产生的线程都会被终止。所以我需要在每个线程上进行连接以等待它返回。

我的问题是,我将如何编写一个程序,在其中创建2个在无限循环中运行的线程?如果我等待加入一个无限的线程,第二个将永远不会有机会被创建!

2 个答案:

答案 0 :(得分:6)

您可以按以下顺序执行此操作:

pthread_create thread1
pthread_create thread2
pthread_join thread1
pthread_join thread2

换句话说,在尝试加入任何之前,先启动 all 您的线程。更详细地说,您可以从以下程序开始:

#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;
}

这将尝试在加入any之前启动三个线程,然后它将以相反的顺序连接到它设法运行的所有线程。正如预期的那样,输出是:

thread 0x28cce4
thread 0x28cce8
thread 0x28ccec
main 0x28ccec
main 0x28cce8
main 0x28cce4

答案 1 :(得分:2)

pthread_join的两个主要用途是(1)在创建的线程完成之前阻塞的便捷方式; (2)您实际上对pthread_join中创建的线程返回的结果感兴趣。

如果您在main中没有其他工作要做,并且您只是阻止以阻止整个过程终止,那么您可以使用pthread_exit退出main。 Main将退出,但生成的线程将继续。

如果您对返回代码不感兴趣,您可以像分离和pthread_exit main一样轻松创建线程。

在创建的线程中使用“无限”循环不是最佳实践。通常,您希望线程能够自行关闭。在线程的内部,这可能是一个eof条件,关闭套接字,或其他什么。通常,您希望线程能够从一个或多个其他外部线程中干净地关闭自己。检查无限循环内的开关和类似方法是实现此目的的最简单方法。否则你必须去pthread_cancel路线,捕捉信号等等。所有这些都有点复杂。