分离线程与从 main() 调用 pthread_exit(),这两种情况下对资源和内存的影响

问题描述 投票:0回答:1

我对 C 编程相当陌生,目前正在尝试更广泛地了解 pthreads 库和线程。

问题1: 何时以及为什么分离线程是一个不错的选择。我读过的很多东西似乎都说,当您希望线程独立于主线程而存在时,分离线程是有益的。对我来说,这似乎意味着在很多用例中,无论出于何种原因,主线程的寿命可能/通常较短。我想知道为什么在主线程末尾调用 pthread_exit() 不会更简单,我相信它会退出主线程而不会杀死进程,从而杀死剩余的线程(通过一些我认为不会影响的黑暗魔法)从 main 传递到相关线程的任何内存或资源),这将有效地实现与分离线程相同的效果(?)。

问题2: 假设使用主线程中的 pthread_exit() 可以实现类似(如果不是相同的)功能,就像可以通过分离子线程来实现一样。选择其中之一在内存或资源方面是否有任何优势?这两种方法是否都有效地执行相同的操作(即,在所有(对于 pthread_exit() )或特定(对于分离线程)线程完成之前,保持堆和其他资源不被清理。

为任何帮助干杯。

c linux multithreading multiprocessing pthreads
1个回答
0
投票

Q1:我知道分离线程很有用的两种情况。

有时,您有一个执行无限循环的辅助线程,并且没有好方法告诉该线程整个进程即将退出,因此它应该停止。 如果主线程在退出之前尝试加入该线程,

pthread_join
将永远阻塞。 如果它调用
exit
,或从
main
返回,没有 加入循环线程,则该辅助线程将被突然终止 - 无论它是否已分离。 分离该线程声明您打算从它下面退出,因为它无法连接,因为它永远循环,这不是一个错误。

有时,您的主线程应该将大部分时间花在 I/O 操作上,例如

accept
,并将工作分派给辅助线程。 无法等待线程可连接其他类型的 I/O 准备就绪。 分离辅助线程是使主线程不需要调用的一种方法pthread_join

Q2:确实,一般来说,短期程序不需要费心进行细粒度的资源重新分配,事实上,

在退出时清理东西通常会更有效。 (例如,为数万个小分配调用 free

 的时间成本可能会很大,并且所有这些工作对于操作系统在进程退出时擦除整个地址空间来说都是多余的。)

人们会严厉地告诉你永远不要跳过这项工作;这是因为您希望养成仔细管理资源的“习惯”,这样在编写长期运行的程序时就不会搞砸。 但是一旦你养成了这种习惯,就可以故意决定跳过执行其任务并退出的程序的清理工作。

Q3:您没有问,但我认为您可能错过了 exit

pthread_exit

 之间的细微差别。  从任何线程调用 
exit
,都会终止
整个进程
,包括所有其他线程。  从任何线程调用 
pthread_exit,只会终止该线程
,即使它是主线程。  因此,如果您创建一些运行很长时间的线程,然后从主线程调用
pthread_exit而不先加入它们,程序将继续运行
直到所有其他线程退出。
即使其他线程已分离!

所以只有当你想这样做时才这样做。

(相关地,从

main

返回与从辅助线程的线程过程返回不同:从

main

 返回会导致对 
exit
 的调用,而从辅助线程的过程返回会导致对 
pthread_exit
 的调用。因此,从
main
 确实会突然终止仍在运行的任何其他线程——但调用
pthread_exit
 来自 
main
 
 这样做。)

© www.soinside.com 2019 - 2024. All rights reserved.