我刚读了here,当主循环结束时,任何有或没有机会产生的线程都会被终止。所以我需要在每个线程上进行连接以等待它返回。
我的问题是,我将如何编写一个程序,在其中创建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路线,捕捉信号等等。所有这些都有点复杂。