c - 加入任何终止的线程

标签 c linux unix networking pthreads

我正在编写一个 pthreaded 网络应用程序(用 C 语言),我想我应该创建一个线程来处理每个传入连接。但是,我不知道应该使用哪种设计,因为我必须将连接数限制为固定数量(比如 5)。

在阅读 pthread_join 的手册页时,我发现:

There is no pthreads analog of waitpid(-1, &status, 0), that  is,  "join  with  any terminated
thread". If you believe you need this functionality, you probably need to rethink your
application design.

这是为什么?我怎样才能实现我的目标? 谢谢

最佳答案

这是个好问题。

我认为手册页作者的标准推理是进程需要用 waitpid 收割,否则它们会留下资源。 pthreads 并非如此。如果您不需要知道特定线程何时终止(或者不需要它的返回代码),您可以将其设为分离线程;它结束了,就是这样。相反,如果您真的需要加入一个线程,您应该知道您需要加入哪个线程。

进一步考虑,父进程与其子进程之间存在直接的一对多关系。 Waitpid 将等待其子进程,操作系统将跟踪这些子进程并将它们传递给父进程。无论创建了多少代进程,这都会发生 - 父进程收获其子进程。

在线程程序中,任何线程都可以创建其他线程。在这种情况下,包罗万象的 pthread_join 意味着什么?如果所有线程都打算与这个一个 catchall 线程连接,那么一切都很好。但是对于某些线程确实需要与其子线程连接而其余线程可以通过 catchall 连接的程序呢?操作系统或 pthreads 如何在不构建大量基础设施的情况下跟踪在每种情况下应用哪个 join

我想这是可能的,我想每个人都有机会希望在 pthreads 中有一个通用的 waitpid 模拟,但它可能会带来很多开销,实际上,这主要是一种烦恼。当您发现自己处于有多个线程要加入但不知道哪个线程先结束的情况时,您可以构建一个队列(或使用管道或其他任何东西)并让垂死的线程指示它应该加入.

关于c - 加入任何终止的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11821764/

相关文章:

c - 将多个值从一个函数返回到另一函数

c++ - 在 Linux 上使用 CMake 时,如何告诉 PVS-Studio 忽略第三方库中的所有文件

linux - 了解 Bash 短路

c++ - 从 *nix 系统获取 C++ 代码中的特定文件

unix - 在UNIX中比较两个文件

linux - strace 'open' 在可执行文件的库中调用

c - 将函数指针分配给另一个函数内的函数

堆上链表结构的 C 数组

c - Gdb 通过 C 编译的 objdump 的汇编输出

php - MySQL 错误,设置第一个数据库(phpmyadmin,linux 服务器)